MonoSLAM的MatlabCode離線數據處理

      由於論文需要,要做一個對比實驗,所以就想到這個篇最經典的論文。但從Andrew Davsion下載了matlab的源碼。大概看了一下源碼,可以運行demo,看到效果。我想跑我現在對比試驗的數據集,所以就不得不把自己離線的視頻轉換爲和sequences裏的文件相同的屬性的圖像序列,爲.pgm文件,width=320,height=240。圖像的尺寸還好理解,但是當看到.pgm後綴的文件就有點暈了。大概查了一下.pgm文件。它是便攜式灰度圖像格式,在黑白超聲圖像經常使用。有兩種類型p2和p5類型,由文件頭和數據兩部分構成。所以根據需求就寫了一個opencv小程序實現離線視頻序列轉化爲.pgm離散的圖像序列。如下:


/--------------------------------------------------------------
//描述:特徵法提取關鍵幀
//IDE:VS2010
//Opencv版本:OPENCV2.4.9
//DATE:20151018
//AUTHOR:create by hu
//--------------------------------------------------------------
 #include<cstring>  
 #include <cv.h>
 #include <highgui.h>
 #include<iostream>
 #include<cxcore.h>
  
 using namespace std;
 using namespace cv;
  
 //第一個函數:縮放處理函數       
IplImage*doPyrDown(IplImage*in,int filter=IPL_GAUSSIAN_5x5){
            assert(in->width%2==0 && in->height%2==0);//確認長寬像素是偶數(否則無法縮放一半)
            IplImage* out=cvCreateImage(
                cvSize(in->width/2,in->height/2),
                in->depth,
                in->nChannels
                );//創建新圖像,長寬各一半,同深度,同通道數
            cvPyrDown(in,out);
            return(out);
        };


 int main()
  {
      CvCapture *capture;
     capture = cvCreateFileCapture("test3.avi");      
assert(capture!=NULL);


      IplImage *frame;
 IplImage *out;
      cvNamedWindow("Image",1);
 
      int n = 1,m = 412; 
      char *cstr=new char[20];
 
      while(m--)
      {
         frame = cvQueryFrame(capture);

out = cvCreateImage(cvSize(frame->width,frame->height),frame->depth,1);
cvCvtColor(frame,out,CV_BGR2GRAY);
out = doPyrDown( out );
         if(!out)
         break;    
         sprintf(cstr, "%s%d%s", "tutu\\image", n++, ".pgm"); 
         cvShowImage("Image",out);
          cvSaveImage(cstr,out);   
         /*if(cvWaitKey(66)>=0)
                 break;*/
    }
        cvReleaseCapture(&capture);
        //cvReleaseImage(&frame);
        cvDestroyWindow("Image");
         return 0; 
 }

結果如下圖所示:

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