opencv:批量读取一个文件夹下的图片,并转换成视频

来源:互联网 发布:p2p种子搜索器mac版 编辑:程序博客网 时间:2024/05/01 13:10

转载请注明:http://blog.csdn.net/ding977921830/article/details/50950927


//#include "stdAfx.h"#include <opencv2/core/core.hpp>#include <opencv2\highgui\highgui.hpp>#include <iostream>#include <direct.h>//for mk_dir#include <io.h>//for _acess()using namespace cv;using namespace std;int recursive_mkdir( char *dir );//创建多级目录int ImageToVideo(char* outDir,char* videoName,char* inputDir,int startFrame,int endFrame, int imgW,    int imgH,char* imgExt,double fps,int isColor,int fourcc);//图片序列转化为视频 int main(int argc, char** argv) {  char* inputDir="F:\\论文视频库\\视频帧库\\Walking\\";        //一定要加上最后的两个双斜线,输入视频帧的目录      char* videoName="Walking.avi";                                  //输出的视频名字      char* outDir="F:\\论文视频库\\视频帧库\\Walking\\";              //一定要加上最后的两个双斜线,输出的视频的目录  int startFrame = 20;                                        //含义:起始帧  int endFrame = 412;                                         //含义:起始帧,结束帧   int imgW = 768;                                             //含义:视频帧的宽  int imgH = 576;                                             //含义:视频帧的高  char* imgExt = ".jpg";                                      //根据图片的性质选择.jpg,.bmp等类型,一定要注意jpg前面那个                                                              //点,当时我缺了这个点,浪费了我一晚上的时间才找到问题  double fps=24;                                              //帧率  int isColor=1;                                              //颜色  int fourcc=CV_FOURCC('X','V','I','D');                      //CV_FOURCC('X', 'V', 'I', 'D') 表示是XVID库进行压缩,压缩为MPEG4格式      //int frames = 0 ;     //总帧数  IplImage *pImg=NULL;      char cur_fn[255];                                               //表示某张图片的绝对路径  char fullVideoName[255];      //输出视频的完整文件名:路径+文件名  int frameCount = startFrame;                                //计算运行到第N帧      CvVideoWriter *pWriter=NULL;      CvSize size=cvSize(imgW,imgH);        //判断输入文件夹是否存在         if (_access(inputDir,0)==-1)         {           cout<<"the input directory does not exist!"<<endl;            return 0;         }   //判断输出文件夹是否创建 若没有则创建;若为NULL则默认当前工作目录   //char fullVideoName[255];//输出视频的完整文件名:路径+文件名         strcpy_s(fullVideoName,"");   if (outDir==NULL)   {    sprintf_s(fullVideoName,"%s",videoName);//把videoName打印成一个字符串保存在fullVideoName 中    }   else   {        if (_access(outDir,0)==-1)           {               recursive_mkdir(outDir);           }      sprintf_s(fullVideoName,"%s%s",outDir,videoName);//将字符串outDir和videoName连接起来,打印,保存在fullVideoName中   }    pWriter=cvCreateVideoWriter(videoName,fourcc,fps,size,isColor);//CREATE WRITER            while(startFrame<=endFrame)    {     strcpy_s(cur_fn,"");     sprintf_s(cur_fn,"%s%d%s",inputDir,startFrame,imgExt);//need to change       pImg=cvLoadImage(cur_fn,isColor);        if (!pImg)         {      std::cout<<"can't open an image file"<<std::endl;     // return frameCount;     }  Mat mtx(pImg);     // IplImage格式转换成Mat格式 namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);    imshow("MyWindow", mtx);cout<<"运行到第 "<< frameCount<<" 帧 ";     waitKey(10);   //  destroyWindow("MyWindow");     cvWriteFrame(pWriter,pImg);     cvWaitKey(1);     std::cout<<"Write frame "<<startFrame<<std::endl;     startFrame++;     cvReleaseImage(&pImg);     frameCount++;    }   // cvReleaseVideoWriter(&pWriter);    rename(videoName,fullVideoName);//移动文件到指定文件夹   // return  frameCount;     std::cout<<"total frames "<<frameCount<<" have been write to video."<<std::endl;    system("pause");    return 0; } //该函数借鉴了网上资料,自动创建多级目录int recursive_mkdir( char *dir ){ //分解路径名E:\\AA\\BB\\CC\\ // std::string str = dir; int index = 0; int i = 0; while(1) {  std::string::size_type pos = str.find("\\",index);  std::string str1;  str1 = str.substr(0,pos);  if( pos != -1 && i > 0 )  {   if (_access(str1.c_str(),0)==-1)   {       _mkdir(str1.c_str());   }  }  if( pos==-1 )  {   break;  }  i ++;  index = pos+1; } return 0;} 

参考文献:

http://blog.csdn.net/sway_2012/article/details/7786465

0 0
原创粉丝点击