opencv-contrib-python 视频操作

安装

Windows 系统使用 pip install opencv-contrib-python 直接安装(在此之前需要安装 Numpy>=1.11.3)

  • 视频的文件的读写操作:Opencv提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件。支持的格式类型会因系统的不同而变化,但应该都支持AVI格式,下例为读取和存储视频。
import cv2

videoCapture = cv2.VideoCapture('MyInputVid.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)))

videoWriter = cv2.VideoWriter('MyOutWriter.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)

success, frame = videoCapture.read()

while sucess:

    videoWriter.write(frame)

    success, frame = videoCapture.read()

编解码器:

1. cv2.VideoWriter_fource('I', '4', '2', '0'): 该选项是一个未压缩的 YUV 颜色编码,是4:2:0色度子采样。这种编码有很好的兼容性,但会产生较大文件,文件扩展名为 .avi。

2. cv2.VideoWriter_fource('P', 'I', 'M', '1'): 该选项是 MPEG-1 编码类型, 文件扩展名为 .avi。

3. cv2.VideoWriter_fource('X', 'V', 'I', 'D'): 该选项是 MPEG-4 编码类型, 如果希望得到的视频时平 均大小为平均值,推荐使用此选项,文件扩展名为 .avi。

4. cv2.VideoWriter_fource('T', 'H', 'E', 'O'): 该选项时Ogg Vorbis, 文件扩展名为 .ogv。

5. cv2.VideoWriter_fource('F', 'L', 'V', '1'): 该选项是一个Flash视频, 文件扩展名时 .flv。
  • 捕获摄像头的帧

下面介绍如何通过摄像头捕获视频并存储


import cv2

cameraCapture = cv2.VideoCapture(0)  # 0是默认笔记本摄像头 ,如果是外接摄像头 从1编号开始

fps = 30   # an assumption

size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),

              int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))

videoWriter = cv2.VideoWriter('MyOutWriter.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()                        

注意:
  • VideoCapture 类的get() 方法不能返回摄像头帧速率的准确值, 它总是返回 0 。

  • 用 VideoCapture.isOpened 方法做一个判断,是否摄像头打开。

  • 当需要同步一组摄像头时,read方法不再合适, 可用grab() 和 retrive() 方法代替它


success0 = cameraCapture0.grab()

success1 = cameraCapture1.grab()

if success0 and success1:

    frame0 = cameraCapture0.retrieve()

    frame1 = cameraCapture1.retrieve()

Opencv 窗口函数

       Opencv 的 namedWindow() imshow() 和DestroyWindow()函数允许指定窗口名来创建,显示和销毁(destroy)窗口。此外,任意窗口下都可以通过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()
  • waitKey()的参数为等待键盘触发的时间,单位为毫秒,其返回值是-1,(表示没有键被按下)或 ASCII 码,如27表示Esc键。ASCII码列表可以在这里找到。另外,Python提供了一个标准函数ord(), 该函数可以将字符转换为ASCII码。例如, 输入 ord('a')会返回97。

  • 在一些系统中, waitKey()的返回值可能比ASCII码的值更大(在Linux 系统中, 如果Opencv使用GTK作为后端的GUI库,就会出现一个众所周知的bug)。在所有的系统中,可以通过读取返回值的最后一个字节来保证只提取ASCII码,具体代码如下:

keycode = cv2.waitKey(1)
if keycode != -1:
  keycode &= 0xFF

      Opencv 的窗口函数和waitKey()函数相互依赖。Opencv的窗口只有在调用waitKey()函数时才会更新,waitKey()函数只有在Opencv窗口成为活动窗口时,才能捕获输入信息。
      鼠标回调函数setMouseCallback()有五个参数,如前面的示例代码所示。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键

IT小白 ,望与大家共同学习

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容