Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

一步一步来吧

上一节:
Python+Opencv图像处理新手入门教程(三):阈值与二值化

1.Intro

今天这节我们主要看怎么利用opencv读取并处理视频中的内容。

2.VideoCapture

2.1.基本用法

cap = cv2.VideoCapture(src)

其中src指的是视频的路径。例如,我们可以指定视频来源为某个文件:

cap = cv2.VideoCapture('xxx.avi')

也可以指定视频来源为电脑的摄像头:

cap = cv2.VideoCapture(0)

这里的0表示摄像头id,如果有多个摄像头的话则可以顺次指定其他摄像头。
而对于读取到的视频流我们也可以进行一些参数的修改,例如:

cap.set(cv2.CAP_PROP_FRAME_WIDTH, w)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, h)

便可以将视频流的宽度、高度分别指定为w,h。需要注意的是,当修改宽度时,高度也会进行等比例的缩放,反之亦然。此时可以通过:

cap.get(cv2.CAP_PROP_FRAME_WIDTH)
cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

来获取当前视频流的宽度和高度。
除此之外,一些常用的参数还有:

  • cv2.CAP_PROP_FPS:帧率
  • cv2.CAP_PROP_FOURCC:编解码器的4字符代码
  • cv2.CAP_PROP_FRAME_COUNT:(视频文件中的)总帧数

2.2.read

上一步中的VideoCapture获取的是一个视频流,那么接下来我们就可以从这个流中来逐帧的读取图像。读取一帧图像使用的是read方法:

ret, frame = cap.read()
  • ret:布尔值,表示是否成功读取一帧
  • frame:获取到的帧

至此,我们可以写出如下代码,其功能是读取电脑摄像头的图像并实时展示:

import cv2
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    if ret == True:
        cv2.imshow('frame', frame)
        # 按q退出,通过右上角关闭按钮退出可能导致程序崩溃
        if cv2.waitKey(1)& 0xFF == ord('q'):
            break
# 释放摄像头
cap.release()
# 销毁所有窗口
cv2.destroyAllWindows()

3.VideoWriter

顾名思义,VideoWriter的作用就是导出视频了。

out = cv2.VideoWriter(name, fourcc, fps, (w, h))
  • out:一个video writer对象,用于后续向其中写入帧。
  • name:输出视频文件的名称(路径)
  • fourcc:编码器
  • fps:输出帧率
  • w:输出视频宽度
  • h:输出视频高度

编码器为VideoWriter_fourcc,其用法如下:

fourcc = cv2.VideoWriter_fourcc(encode)

其中encode为编码。所谓fourcc,意思就是这个编码有四个字符(Four-Character Codes)。常见的编码如下:

  • cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’):YUV编码,后缀为avi
  • cv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’),MPEG-1编码,后缀为avi
  • cv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’),MPEG-4编码,后缀为avi
  • cv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’),Ogg Vorbis编码,后缀为ogv
  • cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’),Flash编码,后缀为flv

至此,我们可以写出如下代码,其能录制电脑摄像头的一段视频,并存储为output.avi:

import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while True:
    ret, frame = cap.read()
    if ret == True:
        out.write(frame)
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
cap.release()
out.release()
cv2.destroyAllWindows()
上一篇:保存视频


下一篇:获取图像最亮的点