您的位置:首页 > 运维架构

opencv基础知识-videowriter

2016-01-28 09:59 381 查看

一、前言-简介

在试验中需要常常将实验结果进行保存,在opencv中提供很好用的录制视频的句柄,也可称之为类-videowriter。

videowriter应用那是相当的简单,总之分为三步:

//声明
VideoWriter writer;
//打开
writer.open("C:\\Users\\lenovo\\Documents\\04.avi",CV_FOURCC('M', 'J', 'P', 'G'),
rate, //不进行跟踪,定位,只显示、录制时的帧率
Size(inFrame.cols,inFrame.rows),
true);
if (!writer.isOpened())
{
return;
}
//输入
writer<<inFrame;
//释放
writer.release();

open ( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );

  filename 输出视频文件名。

fourcc为 四个字符用来表示压缩帧的codec 例如:

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

若编码器代号为 -1,则运行时会弹出一个编码器选择框.

fps 被创建视频流的帧率。

frame_size 视频流的大小。

is_color 如果非零,编 码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。

二、应用难点

应用中出现的问题归结为:

1、打不开

2、保存文件为空

3、保存的文件打不开

1、打不开

a、输入路径名称不对

在程序中经常遇到打不开的问题,最常见的问题是路径输入不对比如:

strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi

上述代码中赋值操作,因为转义符的原因读入内存中,路径就会出现问题,结果为:

C:UserslenovoDocumentsisual studio 2010TestMyClassTestopencv.avi

当然打不开了,所以在程序中一定注意转义符的问题。

正确的路径命名方式为:

strvideoFile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/3.avi";
strvideoFile = "C:\\Users\\lenovo\\Documents\\visual studio 2010\\TestMyClass\\Testopencv\\3.avi";

b、编码格式不对

在open函数中第二个参数是编码格式,一定按照提供的编码格式进行填写,在应用中最好的解决方法是为-1。当为-1时,程序对弹出如下对话框供你选择



这样就没有问题啦,很容易解决编码问题。

2、保存文件为空

这种问题往往是后缀名不对,自己试过.Mp4没有成功,后来改为.avi就成功了

3、保存文件打不开

其实注意上面两个问题,就可以进行录制视频了,在录制视频无法打开打开问题,这个就不好排查了。

但可以讲一下自己遇到的问题:

最常见的问题是帧率设置不对,已经帧大小不对。

三、实例代码

string strimgfile,strvideoFile ;
/*strimgfile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\12.png";
strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi";*/
strimgfile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/12.png";
//strvideoFile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/3.avi";
//strvideoFile = "C:\\Users\\lenovo\\Documents\\visual studio 2010\\TestMyClass\\Testopencv\\3.avi";
//strimgfile = "12.png";
//strvideoFile = "3.avi";
strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi";
Mat frame = imread(strimgfile);
namedWindow("图像");
imshow("图像",frame);
namedWindow("视频");
VideoCapture capture;
VideoWriter writer;
capture.open(strvideoFile);
Mat inFrame;

if (!capture.isOpened())
{
return;
}
int rate = capture.get(CV_CAP_PROP_FPS);
int delay = 1000/rate;
capture>>inFrame;
writer.open("C:\\Users\\lenovo\\Documents\\04.avi",CV_FOURCC('M', 'J', 'P', 'G'),
rate, //不进行跟踪,定位,只显示、录制时的帧率
Size(inFrame.cols,inFrame.rows),
true);
if (!writer.isOpened())
{
return;
}
while(true)
{
capture>>inFrame;
writer<<inFrame;
imshow("视频",inFrame);
waitKey(delay);
if (!capture.grab())
{
break;
}
}
writer.release();
system("pause");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: