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

来源:互联网 发布:开淘宝快递费怎么解决 编辑:程序博客网 时间:2024/05/16 13:10

方法一:代码一在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

0 0
原创粉丝点击