由於論文需要,要做一個對比實驗,所以就想到這個篇最經典的論文。但從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;
}
結果如下圖所示: