OpenCV3-Python视频相关操作
1. 视频文件的读写
OpenCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件。
实例通过VideoCapture读取视频00.avi,然后调用VideoWriter以('I','4','2','0')编码方式将视频保存为01.avi。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import cv2 videoCapture = cv2.VideoCapture( '00.avi' ) fps = videoCapture.get(cv2.CAP_PROP_FPS) size = ( int (videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), int (videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))) ''' 编解码器类型: cv2.VideoWriter_fourcc('I','4','2','0') : 该选项是一个未压缩的YUV颜色编码,是4:2:0色度子采样。这种编码有很好的兼容性,但会产生较大文件。 cv2.VideoWriter_fourcc('P','I','M','1') : 该选项是MPEG-1编码类型,文件扩展名多为.avi cv2.VideoWriter_fourcc('X','V','I','D') : 该选项是MPEG-4编码类型,如果希望得到的视频大小为平均值,推荐此选项。 cv2.VideoWriter_fourcc('T','H','E','O') : 该选项是Ogg Vorbis,文件扩展名为.ogv cv2.VideoWriter_fourcc('F','L','V','1') : 该选项为一个Flash视频,文件扩展名为.flv ''' videoWriter = cv2.VideoWriter( '01.avi' ,cv2.VideoWriter_fourcc( 'I' , '4' , '2' , '0' ), fps,size) success, frame = videoCapture.read() while success: videoWriter.write(frame) success,frame = videoCapture.read() |
2. 捕获摄像头的帧
通过VideoCapture()类获取摄像头的帧流,需要通过传递设备索引(device index)来构造此类(注:请确保已安装摄像头和驱动) 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import cv2 cameraCapture = cv2.VideoCapture( 0 ) if cameraCapture.isOpened(): fps = cameraCapture.get(cv2.CAP_PROP_FPS) size = ( int (cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), int (cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))) videoWriter = cv2.VideoWriter( 'out.avi' ,cv2.VideoWriter_fourcc( 'I' , '4' , '2' , '0' ), fps,size) success, frame = cameraCapture.read() numFramesRemaining = 10 * fps - 1 while success and numFramesRemaining > 0 : videoWriter.write(frame) success,frame = cameraCapture.read() numFramesRemaining - = 1 cameraCapture.release() else : print ( "Camera number is wrong." ) |
3. 显示捕获的帧
OpenCV的namedWindow()、imshow()和DestroyWindow()函数允许指定窗口名来创建、显示和销毁窗口;此外,可通过waitKey()函数在任意窗口下来获取键盘输出,通过setMouseCallback()函数来获取鼠标输入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import cv2 clicked = False def onMouse(event, x, y, flags, param): global clicked if event = = cv2.EVENT_LBUTTONUP: clicked = True cameraCapture = cv2.VideoCapture( 0 ) cv2.namedWindow( 'MyWindow' ) cv2.setMouseCallback( 'MyWindow' ,onMouse) print ( 'Showing camera feed. Click window or press any key to stop' ) success, frame = cameraCapture.read() while success and cv2.waitKey( 1 ) = = - 1 and not clicked: cv2.imshow( 'MyWindow' ,frame) success, frame = cameraCapture.read() cv2.destroyWindow( 'MyWindow' ) cameraCapture.release() |
注:OpenCV的窗口只有调用waitKey()函数时才更新,waitKey()函数只有在OpenCV窗口成为活动窗口时,才能捕获输入信息。
4. 补充
setMouseCallback()由5个参数,其中param为可选参数,是setMouseCallback()函数的第三个参数,默认情况下,该参数为0,回调参数参考值如下:
cv2.EVENT_MOUSEMOVE: 鼠标对应移动
cv2.EVENT_LBUTTONDOWN: 左键按下
cv2.EVENT_RBUTTONDOWN: 右键按下
cv2.EVENT_MBUTTONDOWN: 中间键按下
cv2.EVENT_LBUTTONUP: 左键松开
cv2.EVENT_RBUTTONUP: 右键松开
cv2.EVENT_MBUTTONUP: 中间键松开
cv2.EVENT_LBUTTONDBLCLK: 双击鼠标左键
cv2.EVENT_RBUTTONDBLCLK: 双击鼠标右键
cv2.EVENT_MBUTTONDBLCLK: 双击鼠标中键
鼠标回调的标志参数也可能是以下事件的组合:
cv2.EVENT_FLAG_LBUTTON: 事件对应按下鼠标左键
cv2.EVENT_FLAG_RBUTTON: 事件对应按下鼠标右键
cv2.EVENT_FLAG_MBUTTON: 事件对应按下鼠标中间键
cv2.EVENT_FLAG_CTRLKEY: 对应按下Ctrl键
cv2.EVENT_FLAG_SHIFTKEY: 对应按下Shift键
cv2.EVENT_FLAG_ALTKEY: 对应按下Alt按键