OpenCV如何通过摄像头采集视频?本节内容将通过OpenCV实现通过电脑前置摄像头或外接摄像头采集视频的操作。
本节内容主要分为两个部分:
第一个部分为实现从摄像设备读取视频数据;
第二个部分为实现保存读取的数据到指定地址中。
主要通过 cv2.VideoCapture(0)
与 cap.read()
实现选择输入视频设备与读取视频帧。
import cv2
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
# 获取视频设备
cap = cv2.VideoCapture(0)
while(True):
# 从摄像头读取视频帧
ret, frame = cap.read()
# 将视频帧在窗口中展示
cv2.imshow('video', frame)
# 判断输入是否为q键,是则退出
key = cv2.waitKey(10)
if key == ord("q"):
break
# 释放videoCapture
cap.release()
cv2.destroyAllWindows()
首先引入cv2之后,第一部分为创建窗口:
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
代码可无,但是若想要规定视频展示窗口大小,则需要通过 resizeWindow()
函数执行大小。在本案例中指定窗口大小为 640*480。
第二部分内容为获取视频采集设备。
# 获取视频设备
cap = cv2.VideoCapture(0)
通过查看底层源代码,可以发现在 cv2.VideoCapture()
函数中只需要输入一个参数,设备代号即可。
第三部分内容为获取到采集到的视频信息
# 从摄像头读取视频帧
ret, frame = cap.read()
同样,通过查看底层代码,可以发现其返回两个参数:
ret 以及 frame
加断点,打印 ret 与 frame 查看其内容:
ret:
第一个返回参数 ret,返回内容为布尔值,其说明视频采集成功,即是否有数据。
frame:
frame返回的为视频实时信息,以数组的形式返回视频中每一个帧的HMC数据(我觉得应该是??评论可以留言),大小与我们设定的显示框大小吻合,即 640*480。
第四部分为将视频采集数据放到窗口上进行展示
# 将视频帧在窗口中展示
cv2.imshow('video', frame)
数据来源为上一部分的 frame 数组数据。大小为6404803 (3代表为3Channels,三个通道信息)。
剩下部分为退出以及释放空间。
当然,还要另外提一句的是,在判断判断是否按q键退出的部分,还有一个可以调整的参数:
# 判断输入是否为q键,是则退出
key = cv2.waitKey(10)
waitKey函数为等待从键盘中输入一个值,这里的等待的时长为10ms,因为被外层while循环嵌套,所以其实在不断地循环。读者可以尝试时长设为1000ms会发生什么?0又会发生什么?
Q1:为什么我的视频采集没有数据?
看看是不是没开摄像头。当下新笔记本电脑会设置物理防偷窥以及侧面按键关闭摄像头。
Q2:为什么我的采集到的视频“卡顿”?
尝试修改 waitKey
函数中的值,提示:越小越不卡顿,0和负值除外。。。
videowriter
将多个视频帧保存为视频文件;
write
方法:将原始的文件编码压缩之后,再写入到指定文件中去。
write
方法的参数包括:(输出路径,编码格式,帧率,分辨率)
FourCC 用于定义编码格式,关于 FourCC 文档:
http://en.wikipedia.org/wiki/FourCC
常用编码格式列表如下:
编码格式 |
-------- | -----
电脑 | $1600
手机 | $12
2022年11月1日