Opencv保存摄像头视频&&各种编码器下视频文件占用空间对比
打开视频文件或摄像头视频需要使用Opencv中的VideoCapture类,保存视频或摄像头视频到本地磁盘,需要使用Opencv中的VideoWriter类,使用都很简单,这篇文章就记录一下VideoWriter类的用法,主要关注一下VideoWriter在不同编码方式下保存视频文件大小的区别。
VideoWriter类的一个常用构造方式如下:
VideoWriter(const string& filename, int fourcc, double fps,Size frameSize, bool isColor=true);
其中fourcc代表了所使用的编码方式,如果输入-1,则会在运行时候弹出选择对话框,可以选择编码器:
其他的int型的CV_FOURCC()所代表的编码器如下:
CV_FOURCC('P','I','M','1') = MPEG-1 codec
CV_FOURCC('M','J','P','G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
下边这个例子使用了以上所列的各种编码方式保存的摄像头视频,在我的机器上第6、7种方式,即H263和H263I两种方式不能使用,可能是本机上没有对应的编解码器。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
VideoCapture videoInput(0);
if(!videoInput.isOpened())
{
return -1;
}
float fpsInput=24; //获取帧率
float pauseInput=1000/fpsInput; //设置帧间隔
Mat frame;
Size videoSize=Size(videoInput.get(CV_CAP_PROP_FRAME_WIDTH),videoInput.get(CV_CAP_PROP_FRAME_HEIGHT));
string videoPath1="D:\\videoRecordPIM1.avi";
int fourcc1=CV_FOURCC('P','I','M','1');
VideoWriter videoOutput1(videoPath1,fourcc1,fpsInput,videoSize,true);
string videoPath2="D:\\videoRecordMJPG.avi";
int fourcc2=CV_FOURCC('M','J','P','G');
VideoWriter videoOutput2(videoPath2,fourcc2,fpsInput,videoSize,true);
string videoPath3="D:\\videoRecordMP42.avi";
int fourcc3=CV_FOURCC('M', 'P', '4', '2');
VideoWriter videoOutput3(videoPath3,fourcc3,fpsInput,videoSize,true);
string videoPath4="D:\\videoRecordDIV3.avi";
int fourcc4=CV_FOURCC('D', 'I', 'V', '3');
VideoWriter videoOutput4(videoPath4,fourcc4,fpsInput,videoSize,true);
string videoPath5="D:\\videoRecordDIVX.avi";
int fourcc5=CV_FOURCC('D', 'I', 'V', 'X');
VideoWriter videoOutput5(videoPath5,fourcc5,fpsInput,videoSize,true);
string videoPath8="D:\\videoRecordFLV1.avi";
int fourcc8=CV_FOURCC('F', 'L', 'V', '1');
VideoWriter videoOutput8(videoPath8,fourcc8,fpsInput,videoSize,true);
if(!videoOutput1.isOpened())
{
return -1;
}
if(!videoOutput2.isOpened())
{
return -1;
}
if(!videoOutput3.isOpened())
{
return -1;
}
if(!videoOutput4.isOpened())
{
return -1;
}
if(!videoOutput5.isOpened())
{
return -1;
}
if(!videoOutput8.isOpened())
{
return -1;
}
while(true)
{
videoInput>>frame;
if(frame.empty()||waitKey(pauseInput)==27)
{
break;
}
videoOutput1<<frame;
videoOutput2<<frame;
videoOutput3<<frame;
videoOutput4<<frame;
videoOutput5<<frame;
videoOutput8<<frame;
imshow("Video",frame);
}
waitKey();
return 0;
}
通过摄像头录制了长约5分钟的视频,在D盘下生成的文件如下:
生成文件占用空间最小的编码方式是 MPEG-4.2 codec,约为19MB。用红线段标识,对应在VideoWriter类的构造函数参数为CV_FOURCC('M', 'P', '4', '2') 。
最大的是MPEG-1 codec,用蓝线段标识,约为111MB。对应在VideoWriter类的构造函数参数为CV_FOURCC('P','I','M','1') ,所占磁盘空间是前者的5.7倍。所以如果需要24小时全天候录制监控,基于磁盘空间的考虑,可以优先使用MPEG-4.2的编解码方式。
Opencv保存摄像头视频&&各种编码器下视频文件占用空间对比的更多相关文章
- Opencv各种编码器下视频文件大小对比
转载自http://blog.csdn.net/dcrmg/article/details/52215930 做视频样本切割,切片用ffv1编码,比原数据大了几十倍,看到了这篇文章,防止找不到记录一下 ...
- 【模板】Linux下输出文件的对比
命令格式: diff+[参数]+[文件1或目录1]+[文件2或目录2] 命令参数: 指定要显示多少行的文本.此参数必须与-c或-u参数一并使用. -a或--text diff预设只会逐行比较文本文件. ...
- 【python下使用OpenCV实现计算机视觉读书笔记4】保存摄像头视频
读取摄像头内容,然后保存一段十秒钟的视频. import cv2 cameraCapture = cv2.VideoCapture(0) fps = 30 # an assumption size = ...
- 基于opencv网络摄像头在ubuntu下的视频获取
基于opencv网络摄像头在ubuntu下的视频获取 1 工具 原料 平台 :UBUNTU12.04 安装库 Opencv-2.3 2 安装编译运行步骤 安装编译opencv-2.3 参 ...
- 【OpenCV】【MFC】图片、视频、摄像头输入响应【详细图解】
记住新建项目后,要配置OpenCV环境!参考链接http://blog.csdn.net/zy122121cs/article/details/49180541 做工程搭建框架什么的,基本的要熟练啊. ...
- [OpenCV]获取摄像头视频
环境:Windows 8 64bit + VS2012 X64 + OpenCV 2.4.7 摄像头的捕捉使用VideoCapture类 Class VideoCapture [OpenCV文档 ...
- Opencv——将摄像头拍摄写成视频文件
这里主要利用了Opencv打开摄像头的代码,以及写入视频的函数,只是这里要注意的是摄像头好像没有帧率,在cvCreateVideoWriter,时要自己设置 #include"cv.h&qu ...
- 基于opencv在摄像头ubuntu根据视频获取
基于opencv在摄像头ubuntu根据视频获取 1 工具 原料 平台 :UBUNTU12.04 安装库 Opencv-2.3 2 安装编译执行步骤 安装编译opencv-2.3 參考h ...
- 在Ubuntu14.04下安装 ffmpeg-2.4.13(处理视频用,将视频保存为图片序列)
首先在 http://www.ffmpeg.org/olddownload.html 下载 ffmpeg-2.4.13.tar.bz2 : 然后安装 yasm 和 libx264: apt-get i ...
随机推荐
- servlet-响应的定时刷新
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.ser ...
- [Windows Server 2012] 安装护卫神·主机管理系统
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装护卫神·主 ...
- 初学JSP_内置对象
out内置对象: 表单,表单常用的的提交方式
- GridView中的日期处理
数字 {0:N2} 12.36 数字 {0:N0} 13 货币 {0:c2} $12.36 货币 {0:c4} $12.3656 货币 "¥{0:N2}" ¥12.36 ...
- CAD得到自定义实体拖放夹点(com接口VB语言)
主要用到函数说明: MxDrawXCustomEvent::MxDrawXCustomEntity::getGripPoints 自定义实体事件,得到拖放夹点,详细说明如下: 参数 说明 LONGLO ...
- vue.js---利用vue cli脚手架工具+webpack创建项目遇到的坑
1.Eslint js代码规范报错 WARNING Compiled with 2 warnings 10:43:26 ✘ http://eslint.org/docs/rules/quotes St ...
- 2 Button
// <summary> /// 设置透明按钮样式 /// </summary> private void SetBtnStyle(Button btn) { btn.Flat ...
- js的一些工具类
//写入cookie function setCookie(name, value) { var Days = 30; //此 cookie 将被保存 30 天 var exp = n ...
- How To:配置Openfiler磁盘
目录 1.系统登陆 2.启用iSCSI Target服务 3.初始化卷组 4.映射LUN 5.查看状态 1.系统登陆 Openfiler系统安装完毕之后,使用提示的地址登陆:https://172.1 ...
- elisp 编程 if 特殊表
elisp中的 if 特殊表与其他语言中的 if 语句逻辑上并无二致,关键在于如何使用. (if (> 4 3) (message "4 is greater than 3" ...