Opencv录视频你需要知道的小九九

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媒体播放器推荐原因同上。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值