1. 简介
opencv库内的VideoWriter为开发者提供了一个可以对cv::Mat进行录制视频的接口,为需要录制视频的CV工程提供了便利
2. 使用方法
VideoWriter使用十分简单,常用的就以下几个函数:
a. 构造函数
cv::VideoWriter::VideoWriter(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true);
- filename为待保存视频文件的路径,输入字符串或者std::string即可
- fourcc为视频编码格式,使用时可由cv::VideoWriter::fourcc()函数进行指定
- fps为视频保存的帧率(opencv将录制的视频帧数设置为可调节,这样可以便于对视频的速度进行设置)
- frameSize为视频保存的分辨率
- isColor决定视频保存为彩色还是黑白,默认为彩色
b. fourcc函数
static int cv::VideoWriter::fourcc(char c1, char c2, char c3, char c4);
该函数用于在构造VideoWriter时设置编码格式,具体的设置需要有硬件提供支持,常见的有以下几种:
cv2.VideoWriter_fourcc('I','4','2','0')
//这个选项是一个未压缩的YUV编码,4:2:0色度子采样。这种编码广泛兼容,但会产生大文件。文件扩展名应为.avi。
cv2.VideoWriter_fourcc('P','I','M','1')
//此选项为MPEG-1。文件扩展名应为.avi。
cv2.VideoWriter_fourcc('X','V','I','D')
//此选项是一个相对较旧的MPEG-4编码。如果要限制结果视频的大小,这是一个很好的选择。文件扩展名应为.avi。
cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
//此选项是另一个相对较旧的MPEG-4编码。如果要限制结果视频的大小,这是一个很好的选择。文件扩展名应为.m4v。
cv2.VideoWriter_fourcc('X','2','6','4'):
//这个选项是一种比较新的MPEG-4编码方式。如果你想限制结果视频的大小,这可能是最好的选择。文件扩展名应为.mp4。
cv2.VideoWriter_fourcc('H','2','6','4'):
//这个选项是传统的H264编码方式。如果你想限制结果视频的大小,这可能是很好的选择。文件扩展名应为.mp4。
cv2.VideoWriter_fourcc('T','H','E','O')
//这个选项是Ogg Vorbis。文件扩展名应为.ogv。
cv2.VideoWriter_fourcc('F','L','V','1')
//此选项为Flash视频。文件扩展名应为.flv。
cv2.VideoWriter_fourcc('M','J','P','G')
//此选项为motion-jpeg视频。文件扩展名应为.avi。
经验证:X264为压缩效率最高的编码格式,可以做到3s的视频802.6KB,H264次之为861.2KB,I420最大为131.3MB,在嵌入式开发板内建议使用X264
c. isOpened函数
virtual bool isOpened() const;
该函数用来判断VideoWriter是否正常工作,正常工作返回true,否则返回false
d. Write函数
virtual void write(InputArray image);
该函数用于将一帧图片保存到文件里面
image传入待保存的Mat变量即可
e. operator <<
VideoWriter& operator << (const Mat& image);
为了方便IO处理,也可用流控制符来完成写入操作,如
writer << image;
(避坑): OpenCV并未对*cv::VideoWriter类型的 “<<”符号进行重载,故在对cv::VideoWriter进行 << 操作时,请先将其解指针,如下:
*(this->writer) << image;
f. 析构函数
virtual void release();
这个就没什么可说的了,记得对指针类型的VideoWriter调用该函数即可
3. 注意事项
a. VideoWriter数据保存在哪里
OpenCV为了减缓内存消耗,VideoWriter会将数据直接保存到外存,这样就可以保证在内存极小的情况下进行长时间录制,故嵌入式设备如果发现内存不足应将注意力放在其他地方,大部分时候都是Mat实例调用clone函数进行克隆,但未即使释放内存。
b. 录制视频始终为44bit
问题分析:
会出现该问题,证明图像数据未写入文件,文件内只保存了视频开头标注。
解决方案:
常见的几种情况如下,第一种为在构造VideoWriter时将图像的分辨率设置错误,如将图像宽度与高度对调;第二种为外存不足,数据无法继续写入;第三为传入writer的图像为空。
c. 录制的视频无法播放
常见的几种情况如下,第一种为在构造VideoWriter时输入的文件后缀名错误;第二种为图像写入的大小与VideoWriter构造时预设的大小不相等;第三种VideoWriter预设的图像颜色属性与写入的图像不同;第四播放器不支持该压缩格式的文件播放。
d.推荐使用的视频播放器
Windows平台推荐使用WPS自带的视频播放软件,该软件可以在视频文件设置错误的时候,尽可能的播放视频,效果良好。
Linux平台推荐使用mpv媒体播放器推荐原因同上。