前言
本专栏前面文章中所介绍的都是对于图像的处理,那么如果是视频我们将如何进行处理呢?首先我们先要有个概念,就是视频是由帧组成的,而为了让人眼看见的视频变得流畅,一般一秒钟会有多个帧,这就有了一个概念,叫帧率,即每秒多少帧,下面我们将针对视频以及视频相关信息结合函数进行讲解
打开视频
使用cv2.VideoCapture()我们可以打开视频,当传入参数是视频路径时,打开视频文件;当传入参数是整数值时调用摄像头,一般电脑的默认摄像头从零开始,打开代码如下(假设我们调用0号摄像头):
capture = cv2.VideoCapture(0)
如果不出意外的话什么都没有发生,那么为什么呢,因为只是单纯的打开了,并没有对他进行其他操作,真正要显示还有额外的代码,为什么还有额外的代码呢?因为opencv是用于图像处理的,它本身就是要为图像服务的,而细分每一帧就可以按照帧对于视频进行处理,因为每一帧都是一个图像
获取视频信息
我们最常用的视频信息就是帧率以及帧这张图片的宽度和高度,之前我们已经实例化了一个capture,我们只需要使用get就可以获取相关信息,相关参数如下
参数 | 作用 |
---|---|
cv2.CAP_PROP_FRAME_WIDTH | 获取帧的宽度 |
cv2.CAP_PROP_FRAME_HEIGHT | 获取帧的高度 |
cv2.CAP_PROP_FPS | 帧率(fps) |
根据英文名称也非常的好记
用法如下
width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
调用get后返回值就是我们需要得到的信息
打开视频并播放
首先我们可以使用isOpened()来检测是否打开成功,如果返回True打开成功,返回False打开失败
if capture.isOpened():
print("打开成功!")
else:
print("打开失败!")
视频播放
使用read()即可读取帧,返回一个返回值和帧,如果返回值为空说明视频已经读取完了,此时frame为None,为了通用,建议打开摄像头的也这样写,我们可以看到,frame就是我们之前遇到的图片的文件,只不过连续不断的输出一张张图片罢了,当输入键盘中的q
键时退出摄像头
while capture.isOpened():
ret, frame = capture.read()
if ret:
cv2.imshow('frame', frame)
if cv2.waitKey(0) & 0xFF == ord('q'):
break
capture.release()
视频的保存
无论是从文件中的视频还是打开摄像头的视频都可以进行保存,我们假设path是要保存的视频路径(含视频名称和类型)
fourcc = cv2.VideoWriter_fourcc(*"XVID")
writer = cv2.VideoWriter(path, fourcc, int(fps), (int(width), int(height)), False)
那么我们在之前的代码中增添一部分就可以保存视频
while capture.isOpened():
ret, frame = capture.read()
if ret:
cv2.imshow('frame', frame)
writer.write(frame)
if cv2.waitKey(0) & 0xFF == ord('q'):
break
capture.release()
writer.release()