一步一步来吧
上一节:
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()