Python + 读取 / 写入视频

读取并播放视频

这篇教学会介绍OpenCV 里的VideoCapture() 方法,透过这个方法,读取电脑中的视频,或开启电脑的摄影镜头读取视频画面。

因为程式中的OpenCV 会需要使用镜头或GPU,所以请使用本机环境( 参考:使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考:使用Anaconda ) ,并安装OpenCV 函式库( 参考:OpenCV函式库)。

VideoCapture() 开启视频

使用VideoCapture() 方法时,如果参数指定「视频路径」,可以开启电脑中的视频,如果参数指定「0、1、2...」数字,则会开启电脑的摄影镜头读取影像画面,数字代表镜头的编号,通常都从0 开始,如果有外接镜头可能会是1、2 之类的编号。

cap = cv2.VideoCapture(0)         # 读取摄影镜头
cap = cv2.VideoCapture('视频路径') # 读取电脑中的视频

如果有遇到错误讯息( 特别是Windows ),可以尝试加入第二个cv2.CAP_DSHOW 参数( 表示DirectShow,也就是目前系统)。

cv2.CAP_DSHOW 是DirectShow,内容是一个「数值」,使用后等同输入700,第二个参数详细可以参考:Flags for video I/O

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

使用VideoCapture() 之后,通常会再透过cap.isOpened() 来判断视频是否正常开启,如果正常开启会回传True,否则是False,下方的程式码执行后,会读取电脑摄影镜头,如果没有读取到镜头资讯,就会印出Cannot open camera 的文字。

import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():print("Cannot open camera")exit()

顺利开起视频后,就能使用cap.read() 的方法,读取视频的每一帧( 例如60fps 表示一秒钟有六十帧),读取后会回传两个值,第一个值ret 为True 或False,表示顺利读取或读取错误,第二个值表示读取到视频某一帧的画面,如果读取成功,就能透过imshow() 的方法,将该帧的画面显示出来,下方的程式码除了显示图片,更搭配waitKey(1) 方法,就能不断更新显示的图片,看起来就像播放视频一般。

使用waitKey(1) 表示每一毫秒更新一次画面,参数数值设定越大,图片更新时间就会越长,视频看起来就会出现延迟的状况,参考:waitKey() 等待多久关闭

import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():print("Cannot open camera")exit()
while True:ret, frame = cap.read()             # 读取视频的每一帧if not ret:print("Cannot receive frame")   # 如果读取错误,印出讯息breakcv2.imshow('oxxostudio', frame)     # 如果读取成功,显示该帧的画面if cv2.waitKey(1) == ord('q'):      # 每一毫秒更新一次,直到按下 q 结束break
cap.release()                           # 所有作业都完成后,释放资源
cv2.destroyAllWindows()                 # 结束所有视窗

搭配cvtColor() 改变视频色彩

cvtColor() 方法可以改变图片的色彩,如果将视频每一帧的图片套用cvtColor(),最后就会呈现的改变颜色的视频,下面的程式码执行后,就会读取电脑摄影机,并将彩色视频转换成黑白色彩的视频。

import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():print("Cannot open camera")exit()
while True:ret, frame = cap.read()if not ret:print("Cannot receive frame")breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 转换成灰阶# gray = cv2.cvtColor(frame, 6)  # 也可以用数字对照 6 表示转换成灰阶cv2.imshow('oxxostudio', gray)if cv2.waitKey(1) == ord('q'):break
cap.release()
cv2.destroyAllWindows()

读取串流图片MJPEG ( Motion JPEG ) 使用cap.read() 不仅能读取电脑摄影机画面,也可以读取MJPEG ( Motion JPEG ) 的图片串流格式,Motion JPEG ( Motion Joint Photographic Experts Group、M-JPEG ) 是一种影像压缩格式,每一个视讯框图像分别使用JPEG 编码,常用在网路摄影机、物联网摄影机之类的装置。 下方的范例读取交通部的「CCTV 开放资料集」所提供的「国道监视器影像」,读取后就能开启OpenCV 视窗并即时监看特定影像。

import cv2
cap = cv2.VideoCapture('https://cctvn.freeway.gov.tw/abs2mjpg/bmjpg?camera=15771')if not cap.isOpened():print("Cannot open camera")exit()
while True:ret, frame = cap.read()             # 读取视频的每一帧if not ret:print("Cannot receive frame")   # 如果读取错误,印出讯息# 出现错误就再读取一次,避免程式到此处就停止cap = cv2.VideoCapture('https://cctvn.freeway.gov.tw/abs2mjpg/bmjpg?camera=15771')continuecv2.imshow('oxxostudio', frame)     # 如果读取成功,显示该帧的画面if cv2.waitKey(1) == ord('q'):      # 每一毫秒更新一次,直到按下 q 结束break
cap.release()                           # 所有作业都完成后,释放资源
cv2.destroyAllWindows()                 # 结束所有视窗

写入并储存视频

这篇教学会介绍OpenCV 里的VideoWriter() 方法,透过这个方法,可以将读取到的视频( 电脑中的视频或摄影镜头拍摄的视频),进行转档或转换色彩,储存成新的视频档。

因为程式中的OpenCV 会需要使用镜头或GPU,所以请使用本机环境( 参考:使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考:使用Anaconda ) ,并安装OpenCV 函式库( 参考:OpenCV函式库)。

使用VideoWriter() 储存视频

使用VideoWriter() 方法,可以建立一个空的「视频档」,将撷取到的影像图片组成新的串流格式,写入空的视频档案里,完成后就会储存成新为新的视频。

  • 使用cv2.VideoCapture() 读取电脑摄影机镜头影像。
  • 读取影像后使用cap.get() 方法取得视频长宽尺寸。
  • 使用cv2.VideoWriter_fourcc() 方法设定储存的视频格式。
  • 使用cv2.VideoWriter() 产生空的视频档案( 设定格式、帧率fps、长宽)。
  • 在while 回圈里使用out.write() 方法,将取得的图片写入每一帧。
  • 结束后使用out.release() 释放资源。
import cv2
cap = cv2.VideoCapture(0)                         # 读取电脑摄影机镜头影像。
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))    # 取得影像宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 取得影像高度
fourcc = cv2.VideoWriter_fourcc(*'MJPG')          # 设定视频的格式为 MJPG
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (width,  height))  # 产生空的视频
if not cap.isOpened():print("Cannot open camera")exit()
while True:ret, frame = cap.read()if not ret:print("Cannot receive frame")breakout.write(frame)       # 将取得的每一帧图像写入空的视频cv2.imshow('oxxostudio', frame)if cv2.waitKey(1) == ord('q'):break             # 按下 q 键停止
cap.release()
out.release()      # 释放资源
cv2.destroyAllWindows()

解决无法储存视频的问题

实作过程中,可能会遇到「无法储存视频」的状况,通常的解决方法有下面三种:

  • 修改fourcc 的视频格式,如果是mov 或mp4 的影片档,使用「*'mp4v'」、「*'MJPG'」或「'M','J','P','G'」 ( 星号改半形)。
  • 将输入视频的长宽和输入的长宽度调整为「相同的长宽」。
  • 修改视频的档名,加上01、02、03...等数字。

搭配cvtColor() 储存为黑白的视频

使用cvtColor() 方法可以改变图片的色彩,如果将视频每一帧的图片套用cvtColor(),最后就会呈现的改变颜色的视频,下面的程式码执行后,就会读取电脑摄影机,并将彩色视频转换成黑白色彩的影片,最后储存为黑白的视频。

import cv2
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.mov', fourcc, 20.0, (width,  height))
# 如果转换成黑白视频后如果无法开启,请加上 isColor=False 参数设定
# out = cv2.VideoWriter('output.mov', fourcc, 20.0, (width,  height), isColor=False)
if not cap.isOpened():print("Cannot open camera")exit()
while True:ret, frame = cap.read()if not ret:print("Cannot receive frame")breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 转换成灰阶out.write(gray)cv2.imshow('oxxostudio', gray)if cv2.waitKey(1) == ord('q'):break
cap.release()
out.release()
cv2.destroyAllWindows()

get 方法可取得的视频属性

上述的范例程式码中,使用了cap.get() 方法取得视频属性,下方列出该方法可取得的属性,以及对应的数字编号:

数字属性说明
0CAP_PROP_POS_MSEC视频目前播放的毫秒数。
1CAP_PROP_POS_FRAMES从0 开始的被截取或解码的帧的索引值。
2CAP_PROP_POS_AVI_RATIO视频播放的相对位置,0 表示开始,1 表示结束。
3CAP_PROP_FRAME_WIDTH视频宽度。
4CAP_PROP_FRAME_HEIGHT视频高度。
5CAP_PROP_FPS视频帧率fps。
6CAP_PROP_FOURCC编解码的的四个字元。
7CAP_PROP_FRAME_COUNT视频总共有几帧。
8CAP_PROP_FORMAT视频格式。
9CAP_PROP_MODE 模式目前的截取模式。
10CAP_PROP_BRIGHTNESS 亮度摄影机亮度。
11CAP_PROP_CONTRAST摄影机对比度。
12CAP_PROP_SATURATION摄影机饱和度。
十三CV.CAP_PROP_HUE摄影机HUE 色调数值。
14CAP_PROP_GAIN摄影机图像增益数值。
15CAP_PROP_EXPOSURE摄影机曝光度。
16CAP_PROP_CONVERT_RGB 复制代码视频是否有转换为RGB。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将overleaf的latex格式转换为word

安装pandoc https://pandoc.org/installing.html 下载安装后,打开windows shell,测试是否安装成功: pandoc -v使用代码转换 进入你防止latex的文件夹,运行以下命令: pandoc -o output.docx -t docx .\main.tex其中…

录制微课的软件有哪些?这些软件你不能错过!

随着在线教育的蓬勃发展,微课已成为一种广受欢迎的教学形式。微课录制软件的选择对于教师而言至关重要,它不仅要具备简单易用的特点,还要能够满足高质量录制的需求。而对于教师来说,录制微课的软件有哪些呢?本文将介绍…

常用金属材料检测试题

一、单选题 1.正火采用的哪一种冷却方式( ) A.风冷 B.炉冷 C.油冷 D.空冷 参考答案:D 2.哪个合金属于弹簧钢?( ) A.20Cr B.9SiCr C.65Mn D.W18Cr4V 参考答案:C 3.T8A是什么工具钢?( ) A.碳素工具钢 B

【日常记录】【插件】js 获取浏览器信息、操作系统等相关信息

文章目录 1. 原生方式2. 插件的方式2.1 Bowser 的基本使用2.2 UAParser2.3 Platform.js 参考链接 1. 原生方式 原生方式可以通过 navigator.userAgent 来获取 需要写一个正则来匹配,获取相关的信息 2. 插件的方式 获取浏览器版本相关信息的库主要有以下几个 Bowser&…

无人机在应急救援中的几种应急方案

1.消防应急方案 MS190无人机消防应急载荷:配备有水基灭火弹、水枪、灭火弹抛投器等设备。也可携带不同的任务载荷,根据救援需求灵活配置,能够在火灾现场进行侦察、监测和灭火作业。 2.系留照明应急方案 M30系列无人机系留装置:…

高德API接入安卓相关问题说明

高德API接入安卓相关问题说明 我们都在怀念过去,失去后我们才懂得珍惜,有些人或事早已经远去,可是还是会想起曾经拥有的岁月,会是一种喜悦,会是一种遗憾…… 目前Android开发已经普遍使用Android Studio,开…

人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了各种视觉处理函数,并…

红酒与电影经典:那些银幕上的醉人瞬间

在光影交织的银幕世界里,红酒不仅是品味生活的象征,更是情感与故事的催化剂。每当夜幕降临,一杯色泽深邃的红酒,便能带我们走进那些令人陶醉的影片瞬间,感受不同的人生百态。今天,就让我们一起回味那些银幕…

告别付费 API!使用 Ollama 和 MATLAB 玩转本地大模型

在“当MATLAB遇见ChatGPT?”一文中介绍了名为MatGPT的插件,该插件通过调用ChatGPT的API,实现了在MATLAB中与Chat GPT对话的功能。 虽然Open AI的GPT3.5和GPT4o可以免费使用,但调用API却需要收费,因此使用MatGPT这类插件…

mybatis 延迟加载

MyBatis的延迟加载(Lazy Loading)是一种优化技术,用于在需要时才加载关联对象或集合,从而提高性能和效率。以下是对MyBatis延迟加载的详细介绍: 延迟加载的基本概念 延迟加载是指在第一次访问对象的属性时才加载该对象…

阿一课代表随堂分享:红队反向代理之使用frp搭建反向代理

frp反向代理 frp简介 frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。 frp 是一个可用于内网穿透的高性能的反向代理应用,分为服务端frps和客户端frpc,支持 tcp, udp, http, https 协议。详…

修改服务器挂载目录

由于我们的项目通常需要挂载一个大容量的数据盘来存储文件数据,所以我们每台服务器都需要一个默认的挂载目录来存放这些数据,但是由于我们的误操作,导致挂载目录名字建错了,这时候后端就读不到挂载目录了,那我们我们的…

竟能让函数只执行一次?分享 1 段优质 JS 代码片段!

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿! 大家好,我是大澈! 本文约 700 字,整篇阅读约需 1 分钟。 今天分享一段优质 JS 代码片段,确保某函数在某…

Java面经知识点汇总版

Java面经知识点汇总版 算法 14. 最长公共前缀(写出来即可) Java 计算机基础 数据库 基础 SQL SELECT first_name, last_name, salary FROM employees WHERE department Sales AND salary > (SELECT AVG(salary)FROM employeesWHERE department Sal…

德语中含“Augen”的惯用语表达-柯桥小语种学习德语考级

在我们的德语学习过程中,除了词汇的记忆,另一项重要的记忆任务就是惯用语的背诵啦。要知道,德语中有大量的Redewendung,他们以其言简意赅的表达,在日常用语中备受青睐。上一期我们已经学习了部分含有“Hand”的惯用语&…

小抄 20240707 晚熟

01 在抖音快手微博小红书,搜“晚熟的人”,你会看到上百种晚熟的表现,而且写出这些表现的博主,还都会说摘自莫言《晚熟的人》。 “不是我说的,是莫言说的,我说的可能有假,莫言说的还能有假吗&am…

神经网络习题

不具有权重共享的网络是: **多层感知机(Multilayer Perceptron,MLP): ** 特点:每一层的每一个神经元都与上一层的每一个神经元全连接,权重独立于每个连接,不存在权重共享。 权重共享…

Unicode 与 UTF-8 的区别与联系

文章目录 UnicodeUTF-8联系区别Unicode 转义序列字符编码与字符的对应规则例子 Unicode 定义:Unicode 是一个字符编码标准,旨在为世界上所有的字符分配一个唯一的编码。 编码范围:Unicode 的编码范围从 0x0000 到 0x10FFFF,能够表…

算法·高精度

高精度算法 分为四则运算加减乘除 适用条件 都高精度了,肯定时long long都会爆的情况——一般与阶乘有关 注意事项 用数组模拟位运算,最后在一起考虑进位 注意res[i1]res[i]/10; 是""不是 两数相加,相乘数组的新长度会变&…

去中心化时代的到来:区块链如何重新定义权力和控制

随着区块链技术的迅猛发展,我们正逐步进入一个去中心化的新时代。区块链不仅仅是一种技术,更是一种理念,它通过去除中心化的权威和控制节点,重新定义了数据管理、交易验证和权力分配的方式。本文将深入探讨区块链如何在去中心化时…