Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm
18.2 VideoWriter类
OpenCV中的cv2.VideoWriter类可以将图片序列保存成视频文件,也可以修改视频的各种属性,还可以完成对视频类型的转换。
18.2.1 类函数介绍
cv2.VideoWriter类常用的成员函数包括:构造函数、write函数等。本节简单介绍这两个常用的函数。
1.构造函数
OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。该函数的语法格式是:
<VideoWriter object> = cv2.VideoWriter( filename, fourcc, fps, frameSize[,
isColor] )
式中:
● filename指定输出目标视频的存放路径和文件名。如果指定的文件名已经存在,则会覆盖这个文件。
● fourcc表示视频编/解码类型(格式)。在OpenCV中用函数cv2.VideoWriter_fourcc()来指定视频编码格式。cv2.VideoWriter_fourcc()有4个字符参数。这4个字符参数构成了编/解码器的“4字标记”,每个编/解码器都有一个这样的标记。下面列出几个常用的标记。
● cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’)表示未压缩的YUV颜色编码格式,色度子采样为4:2:0。该编码格式具有较好的兼容性,但产生的文件较大,文件扩展名为.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’, ‘I’)表示Flash视频,生成的文件的扩展名为.flv。
欲知更多的字符参数组合,可以在网站http://www.fourcc.org上查询。若参数fourcc为“-1”,则程序运行时会弹出一个对话框,如图18-3所示。在该对话框中,用户可以根据自己的需要选择合适的压缩程序和压缩质量。
● fps为帧速率。
● frameSize为每一帧的长和宽。
● isColor表示是否为彩色图像。
例如,下面的语句完成了cv2.VideoWriter类的初始化工作:
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20, (1024,768))
如果希望通过如图18-3所示对话框设置编/解码格式,可以使用语句:
fourcc = -1
out = cv2.VideoWriter('output.avi', fourcc, 20, (1024,768))
2. write函数
cv2.VideoWriter类中的函数cv2.VideoWriter.write()用于写入下一帧视频。该函数的语法格式为:
None=cv2.VideoWriter.write(image)
式中,image是要写入的视频帧。通常情况下,要求彩色图像的格式为BGR模式。
在调用该函数时,直接将要写入的视频帧传入该函数即可。例如,有一个视频帧为frame,要将其写入上面的示例中名为out的cv2.VideoWriter类对象内,则使用语句:
out.write(frame)
上述语句会把frame传入名为output.avi的out对象内。
3.释放
在不需要cv2.VideoWriter类对象时,需要将其释放。释放该类对象时所使用的是函数cv2.VideoWriter.release()。该函数的语法格式是:
None = cv2.VideoWriter.release( )
例如,当前有一个cv2.VideoWriter类的对象out,可以用以下语句将其释放:
out.release()
18.2.2 保存视频
保存视频包括创建对象、写入视频、释放对象等多个步骤,下面对各个步骤做简单的介绍。
1.创建对象
在创建对象前,首先需要设置好参数。
● 设置好要保存的具体文件名,例如:filename=’‘out.avi’’。
● 使用cv2.VideoWriter_fourcc()确定编/解码的类型,例如:fourcc =cv2.VideoWriter_fourcc(*‘XVID’)。
● 确定视频的帧速率,例如:fps=20。
● 确定视频的长度和宽度,例如:size=(640,480)。
然后利用上述参数,创建对象。例如:
out = cv2.VideoWriter( filename , fourcc , fps , size )
当然,也可以直接在构造函数内用需要的参数值创建对象。例如:
out = cv2.VideoWriter('out.avi', fourcc, 20,(640,480))
2.写入视频
用函数cv2.VideoWriter.write()在创建的对象out内写入读取到的视频帧frame。使用的代码为:
out.write(frame)
3.释放对象
在完成写入后,释放对象out。代码为:
out.release()
eg1:使用cv2.VideoWriter类保存摄像头视频文件。
代码如下:
import cv2
cap = cv2.VideoCapture(0)
fourcc = -1
out = cv2.VideoWriter('output.avi',fourcc, 20, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) == 27:
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
#按Esc 键,退出视频录制
运行上述程序,程序就会捕获当前摄像头的视频内容,并将其保存在当前目录下名为“output.avi”的视频文件中。