[笔记] 关于OpenCV-Python 的视频处理笔记

系统 1358 0

最近在公司疯狂做 Demo,最近需要使用 cv2 里的视频操作,之前一直也没放在心上,借这次机会好好研究一下吧。
此外,吐槽一句,做 Demo 前最好大家统一一下所用的环境。Opencv-Pyhton 2.x 与 3.x 会存在部分属性函数名的修改,到时候 debug 就十分的繁琐。
至于两者的区别,可以看看文章末尾的参考资料。本文所使用的环境为:Python 2.7, Opencv-Python 3.4.0

目录

  1. 获取并展示视频
  2. 保存视频
  3. 常用方法

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论