OpenCV3-Python视频相关操作
admin 于 2018年04月12日 发表在 计算机视觉

1. 视频文件的读写

OpenCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件。

实例通过VideoCapture读取视频00.avi,然后调用VideoWriter以('I','4','2','0')编码方式将视频保存为01.avi。

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)来构造此类(注:请确保已安装摄像头和驱动) 

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()函数来获取鼠标输入。

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按键

下一篇:《OpenCV3-Python摄像头实时图像》

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:opencv3,videocapture