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

OpenCV学习笔记:序列图片生成视频流方法

2014-06-22 20:52 1406 查看

方法一:代码一在opencv2.4.3,VS2010上测试正常

目前,OpenCV只支持avi的格式,而且生成的视频文件不能大于2GB,而且不能添加音频。

将图片序列合成视频流,主要用到VideoWriter类,这个类是highgui中很重要的一个工具类,通过它我们可以很方便的将图片序列保存成视频文件。
类内成员函数有构造函数,open,isOpened,write等
int main()
{
//图像序列提取路径
char filename[100];
Mat source_img;
//已处理帧序列计数
int frame_cnt = 1;
//初始化视频编写器,参数根据实际视频文件修改
VideoWriter writer("E:\\dest\\mark.avi",CV_FOURCC('X','V','I','D'),
25.0, Size(512,512), 1 );
namedWindow("mark_win");
//NUM_FRAME为需处理的图片序列总数
while( frame_cnt != NUM_FRAME ){
sprintf( filename, "E:\\source\\img%04d.jpg", frame_cnt );
source_img = imread( filename, 1 );
if( source_img.empty() ){
cout<<"can not read filename's img"<<endl;
return -1;
}
writer << source_img;
imshow( "mark_win", source_img );
if( waitKey(1)==27  ){
break;
}
++frame_cnt;
}
return 0;
}

VideoWriter构造函数参数分别是:文件的名称,格式,帧率,分辨率大小,是否彩色。

其他支持格式有:

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

方法二:早期opencv版本

直接上代码:
int main(int argc, char* argv[])
{
system("dir /b img > filelist.txt");

ifstream imglist("filelist.txt");
string buf;
int numline=0;
while(imglist)
{
if(getline(imglist,buf))
{
numline++;
}
}
imglist.close();

string open_dir="img/";
IplImage *frame=cvLoadImage(open_dir.append("1.jpg").c_str());
if(!frame) return;
CvVideoWriter *videoWriter=cvCreateVideoWriter("avi/peng.avi",-1,30,cvSize(frame->width,frame->height));
if(!videoWriter) return;

int ret=0;
ret=cvWriteFrame(videoWriter,frame);
if(ret!=1)
{
cout<<"failed to write the first frame."<<endl;
return;
}
cvReleaseImage(&frame);
frame=NULL;

for(int i=1;i<numline;i++)
{
open_dir="img/";
cout<<"processing...img/"<<(i+1)<<".jpg"<<endl;
char filename[256];
sprintf(filename,"img/%d.jpg",(i+1));
frame=cvLoadImage(filename);
if(!frame)
{
cout<<"can not open the image: "<<filename<<endl;
return;
}
ret=cvWriteFrame(videoWriter,frame);
if(ret!=1)
{
cout<<"can not write to the video."<<endl;
return;
}
cvReleaseImage(&frame);
frame=NULL;
}

cout<<"processing...completed"<<endl;

/*     cvReleaseImage(&frame);*/
cvReleaseVideoWriter(&videoWriter);

return 0;
}


部分内容引自http://blog.csdn.net/yang_xian521/article/details/7440190
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息