opencv:批量讀取一個文件夾下的圖片,並轉換成視頻

轉載請註明: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章