最近在公司疯狂做 Demo,最近需要使用 cv2 里的视频操作,之前一直也没放在心上,借这次机会好好研究一下吧。
此外,吐槽一句,做 Demo 前最好大家统一一下所用的环境。Opencv-Pyhton 2.x 与 3.x 会存在部分属性函数名的修改,到时候 debug 就十分的繁琐。
至于两者的区别,可以看看文章末尾的参考资料。本文所使用的环境为:Python 2.7, Opencv-Python 3.4.0
import cv2
# 创建 VideoCapture 实例,通过摄像头获取视频,其中,参数 0 表示使用默认摄像头
cap = cv2.VideoCapture(0)
# 创建 VideoCapture 实例,通过打开指定视频文件获取视频
# cap = cv2.VideoCapture('out.avi')
# 调用 cap.isOpened() 以确保视频获取成功
while(cap.isOpened()):
ret, frame = cap.read()
# 展示所获取的视频
cv2.imshow('frame',frame)
# 等待键盘输入,若传入参数为 0,则程序将无限制等待用户的案件事件,否则,程序等待所传入参数对应的毫秒时间后,跳出循环。
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放获取设备
cap.release()
# 删除所有建立的窗口
cv2.destroyAllWindows()
import cv2
cap = cv2.VideoCapture(0)
# 创建 VideoWrite 实例用于保存视频,其中,需要指定输出文件路径,编码形式,播放频率以及帧的Size
# From OpenCV :
# The constructors/functions initialize video writers.
# On Linux FFMPEG is used to write videos; on Windows FFMPEG or VFW is used; on MacOSX QTKit is used.
filePath = 'example.avi'
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 创建 VideoWriter 实例
fps = cap.get(cv2.cv2.CAP_PROP_FPS) # 获取 VideoCapture 的 FPS
frameSize = (cap.get(cv2.CAP_PROP_FRAME_WIDTH),cap.get(cv2.CAP_PROP_FRAME_HEIGTH)) # 获取视频的 VideoCapture 的 Size
out = cv2.VideoWriter(filePath, fourcc, fps, frameSize)
while(cap.isOpened()):
ret, frame = cap.read()
out.write(frame)
cap.release()
# 释放视频写入实例
out.release()
cv2.destroyAllWindows()
retval = cv2.VideoCapture.get(propId) #打开视频文件或者相机设备进行视频捕获。
propId 常见取值如下:(以下为 Opencv-Python 3.x 的格式,在 Opencv-Python 2.x 中,需加上前缀 CV_)
"""
cv2.CAP_PROP_POS_MSEC: 视频文件的当前位置(ms)
cv2.CAP_PROP_POS_FRAMES: 从0开始索引帧,帧位置。
cv2.CAP_PROP_POS_AVI_RATIO:视频文件的相对位置(0表示开始,1表示结束)
cv2.CAP_PROP_FRAME_WIDTH: 视频流的帧宽度。
cv2.CAP_PROP_FRAME_HEIGHT: 视频流的帧高度。
cv2.CAP_PROP_FPS: 帧率
cv2.CAP_PROP_FOURCC: 编解码器四字符代码
cv2.CAP_PROP_FRAME_COUNT: 视频文件的帧数
cv2.CAP_PROP_FORMAT: retrieve()返回的Mat对象的格式。
cv2.CAP_PROP_MODE: 后端专用的值,指示当前捕获模式
cv2.CAP_PROP_BRIGHTNESS:图像的亮度,仅适用于支持的相机
cv2.CAP_PROP_CONTRAST: 图像对比度,仅适用于相机
cv2.CAP_PROP_SATURATION:图像饱和度,仅适用于相机
cv2.CAP_PROP_HUE: 图像色调,仅适用于相机
cv2.CAP_PROP_GAIN: 图像增益,仅适用于支持的相机
cv2.CAP_PROP_EXPOSURE: 曝光,仅适用于支持的相机
cv2.CAP_PROP_CONVERT_RGB:布尔标志,指示是否应将图像转换为RGB。
"""
# grab, retrieve, read 的关系
# Grabs the next frame from video file or capturing device.
retval = cv2.VideoCapture.grab()
# Decodes and returns the grabbed video frame.
retval, image = cv2.VideoCapture.retrieve([, image[, flag]])
# Grabs, decodes and returns the next video frame.
retval, image = cv2.VideoCapture.read([,image])
# 由上可知,read 是 grab 和 retrieve 的结合体。当不需要当前的帧或画面时,可以使用 grab 跳过,以减少 read 所耗费的额外时间。
参考资料:
如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!
作者信息:
知乎:没头脑
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink