最近在公司疯狂做 Demo,最近需要使用 cv2 里的视频操作,之前一直也没放在心上,借这次机会好好研究一下吧。
此外,吐槽一句,做 Demo 前最好大家统一一下所用的环境。Opencv-Pyhton 2.x 与 3.x 会存在部分属性函数名的修改,到时候 debug 就十分的繁琐。
至于两者的区别,可以看看文章末尾的参考资料。本文所使用的环境为:Python 2.7, Opencv-Python 3.4.0
目录
- 获取并展示视频
- 保存视频
- 常用方法
1. 获取视频
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
(
)
2. 保存视频
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
(
)
3. 常用方法
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 所耗费的额外时间。
参考资料:
- opencv3 与opencv2不同之处
- OpenCV 3.0与OpenCV 2.4的区别
- OpenCV视频操作
- OpenCV+Python 摄像头采集代码
- Python-OpenCV 处理视频(一)(二): 输入输出 视频处理
- Python&OpenCV - 读写(read&write)视频(video) 详解及代码
- OpenCV—Python视频的读取及保存
- opencv read grab retrieve 关系
如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!
作者信息:
知乎:没头脑
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink