OpenCV对视频的操作
视频是由一系列图像构成,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。
播放的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在1秒内所出现的帧数。
如果从视频中提出独立的帧,就可以使用图像处理的方法对其进行处理,达到处理视频的目的。
OpenCV提供了cv2.VideoCapture类和cv2.VideoWriter类来支持各种类型的视频文件。
1、打开视频文件
1)初始化
cv2.VideoCapture类可以处理指定路径的视频,也可以处理摄像头信息。
OpenCV为VideoCapture类提供了构造函数cv2.VideoCapture(),用于打开摄像头并完成摄像头的初始化工作。
语法格式如下:
video = cv2.VideoCapture(param)
param为初始化参数,常见参数,可用数字“0”,表示使用第1个摄像头,数字“1”表示第2个摄像头,以此类推;如参数为视频文件路径,表示处理指定视频文件。
2)验证初始化是否成功
一般情况下,使用cv2.VideoCapture()函数即可完成摄像头的初始化。
有时,为了防止初始化发生错误(视频读取失败情况),可以使用函数cv2.VideoCapture.isOpened()来检查初始化是否成功。
该函数的语法格式为:
isOpened = cv2.VideoCapture.isOpened()
该函数会判断当前的摄像头|视频是否初始化成功。如果成功,则返回值为True,否则为False。
3)捕获帧
摄像头初始化成功后,就可以从摄像头中捕获帧信息。
捕获帧所使用的函数是cv2.VideoCapture.read()。
该函数的语法如下:
b, image = cv2.VideoCapture.read()
image是返回捕获到的帧,如果没有帧被捕获,则该值为空;
b表示捕获是否成功,如果成功则该值为True,不成功则为False。
4)释放
在不需要摄像头|视频时,要关闭及时摄像头。关闭摄像头使用的是函数cv2.VideoCapture.release()。
该函数的语法是:
cv2.VideoCapture.release()
5)读取指定视频案例
读取本地视频,并在图像窗口中展示。
import cv2
# 1、初始化;返回VideoCapture类型
video = cv2.VideoCapture("video/智能家居广告.mp4")
# 2、验证视频是否打开
isOpened = video.isOpened()
while isOpened:
# 3、每一次循环,读取一帧,返回元组
b, img = video.read()
if b:
# 使用图像方式打开视频
cv2.imshow("", img)
# 正常视频1秒30帧,高清视频1秒48秒
cv2.waitKey(30)
# 4、释放资源
video.release()
2、属性设置
函数cv2.VideoCapture.get()用于获取CideoCapture类对象的属性。
常见属性如下所示:
cv2.CAP_PROP_FRAME_WIDTH 表示获取视频宽度,等同 cv2.VideoCapture.get(3)
cv2.CAP_PROP_FRAME_HEIGHT 表示获取视频高度,等同 cv2.VideoCapture.get(3)
cv2.CAP_PROP_FPS 表示获取视频帧率,等同 cv2.VideoCapture.get(5)
cv2.CAP_PROP_FRAME_COUNT 表示获取视频帧数,等同 cv2.VideoCapture.get(7)
案例1:获取VideoCapture类常用属性
import cv2
video = cv2.VideoCapture("video/智能家居广告.mp4")
# 获取帧的宽度(即:图像宽度)
print(video.get(cv2.CAP_PROP_FRAME_WIDTH))
print(video.get(3))
# 帧的高度(即:图像的高度)
print(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 帧率,即视频的速度,帧率越高视频也高清晰,帧率越低视频越不清晰
print(video.get(cv2.CAP_PROP_FPS))
# 帧数(即图片数量),视频时长 = 帧数 / 帧率
print(video.get(cv2.CAP_PROP_FRAME_COUNT))
video.release()
3、保存视频
OpenCV中cv2.VideoWriter类可以将图片序列保存成视频文件,也可以修改视频各种属性,还可以完成对视频类型的转换。
OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。
该函数的语法格式如下所示:
<VideoWriter object> = cv2.VideoWriter(filename, fourcc, fps, frameSize [, isColor])
filename:指定输出目标视频的存放路径和文件名。如果指定的文件名已经存在,则会覆盖这个文件。
fourcc:表示视频编码、解码类型。
在OpenCV中用函数cv2.VideoWriter_fourcc()来指定视频编码格式。cv2.VideoWriter_fourcc()有4个字符参数。
几个常用的标记:
cv2.VideoWriter_fourcc("M", "P", "4", "V")该编码格式生成的文件的扩展名为.map4。
cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')表示MPEG-4编码类型,该组合生成的文件的扩展名为.avi。
cv2.VideoWriter_fourcc('T', 'H', 'E', 'O')表示Ogg Vorbis编码类型,文件的扩展名为.ogv。
fps:为帧速率。
frameSize:为每一帧的长和宽。
isColor:表示是否为彩色图像。
案例1:将视频进行处理后,保存成一个新视频
import cv2
# 初始化;返回VideoCapture类型
video = cv2.VideoCapture("video/智能家居广告.mp4")
# 获取视频的宽高
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 设置输出视频格式。注意:frameSize参数需要int类型
out = cv2.VideoWriter("video_output/1.mp4", cv2.VideoWriter_fourcc("M", "P", "4", "V"), 30, (width, height))
# 验证视频是否打开
isOpened = video.isOpened()
while isOpened:
# 每一次循环,读取一帧,返回元组
b, img = video.read()
if b:
# 取消红色通道
b, g, r = cv2.split(img)
r[:, :] = 0
# 生成新的图像
img2 = cv2.merge(mv=(b, g, r))
# 将图片保存成视频
out.write(img2)
else:
break
# 释放资源
out.release()
video.release()
运行时会出现OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 13 and format 'mp4 / MP4 (MPEG-4 Part 14)'错误,该错误可以忽略,是因为IDEA没有权限打开播放器导致。
需要注意,使用cv2.VideoWriter()保存视频,只能保存图像,不能保存声音。