加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

OpenCV+C++ 视频图片相互转换

(2012-01-10 12:08:28)
标签:

it

在平时的实验中,经常需要将视频保存为一帧一帧的图片,以获取实验结果;另一方面,很多标准的算法测试数据库都是图片序列(文件名以帧号+图片扩展名),我们可能需要将其转换为视频,因此视频与图片之间的转换是很常见的操作;以下分享一下自己平时编写和使用的两段很简单但是实用的代码;

由于HTML显示的原因,下面那些单引号全部是双引号

1.将图片转换为视频

  int isColor=1;//图片是否为彩色
  double fps=15;//帧率 按照需求设置
  int imgW=352;//图片宽度
  int imgH=288;//图片高度
  char* flieName="videoname.avi";//保存的视频文件名
  int startFrame=0;//图片开始帧号,这样设计主要是因为实验中可能只需要图片的一部分帧序列
  int endFrame=128;//同上

  char cur_fn[255];//
  char* prefix="E:\\image_sequences\\";//图片序列的路径

  char* ext=".jpg";//序列图片后缀名


  CvSize size=cvSize(imgW,imgH);
  pWriter=cvCreateVideoWriter(flieName,CV_FOURCC('X','V','I','D'),fps,size,isColor);//OpenCV 库函数,创建视频写入器

  IplImage *pImg=NULL;
  while(startFrame<=endFrame)
  {
   strcpy(cur_fn,"");
   sprintf(cur_fn,"%s%d%s",prefix,startFrame,ext);//这里的设置适合形如 123.jpg 124.jpg的图片序列

   pImg=cvLoadImage(cur_fn,isColor);
   if (!pImg)    
   {
    std::cout<<"can't open file"<<std::endl;
    return 0;
   }
   cvWriteFrame(pWriter,pImg);
         cvWaitKey(1);
 
   std::cout<<"Write frame "<<startFrame<<std::endl;
   startFrame++;

   cvReleaseImage(&pImg);
  }
 
   cvReleaseVideoWriter(&pWriter);//记得用完 释放资源 否则会运行失败

 

 

2.将视频转换为图片 

这个就比较简单了

 char* vedio="videoname.avi";//视频文件路径
 CvCapture *cap= cvCaptureFromFile(vedio);
 if (cap==NULL)
 {
  return 0;
 }

 char cur_fn[255];//图片文件名

 char* ext=".jpg";//图片格式

 char* prefix="e:\\test\\";//保存图片的文件夹路径 一定要有,因为OpenCV不会自动创建文件夹
 IplImage* pImg=NULL;
 int frame=0;
 while((pImg=cvQueryFrame(cap))!=NULL)
                  
     frame++;
     strcpy(cur_fn,"");
     sprintf(cur_fn,"%s%d%s",prefix,frame,ext);//这里的设置适合形如 123.jpg 124.jpg的图片序列

     cvSaveImage(cur_fn,pImg,NULL);
     cvReleaseImage(&pImg);
   }

 

平时测试算法,截取实验效果图就轻松多了~~~~

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有