#include #include #include #define FLOWSKIP 10 // フロー表示 void DrawFlow( IplImage* vx, IplImage* vy, IplImage* dst ) { for ( int i=0;iheight;i+=FLOWSKIP ){ for ( int j=0;jwidth;j+=FLOWSKIP ){ int dx = (int)cvGetReal2D( vx, i, j); int dy = (int)cvGetReal2D( vy, i, j); cvLine( dst, cvPoint(j,i), cvPoint( j+dx, i+dy ), CV_RGB(255,255,255), 1, 8, 0 ); } } return; } int main(int argc, char** argv){ if( argc != 3 ) { printf( "usage: flow imgfile1 imgfile2\n" ); return 0; } // 画像読込み(濃淡画像を仮定) IplImage *img1 = cvLoadImage( argv[1], CV_LOAD_IMAGE_GRAYSCALE ); IplImage *img2 = cvLoadImage( argv[2], CV_LOAD_IMAGE_GRAYSCALE ); CvSize size = cvGetSize(img1); IplImage *I1 = cvCreateImage( size, IPL_DEPTH_32F, 1); IplImage *I2 = cvCreateImage( size, IPL_DEPTH_32F, 1); cvConvert( img1, I1 ); cvConvert( img2, I2 ); // x,y方向のフローを格納するバッファの確保 IplImage *vel_x = cvCreateImage( size, IPL_DEPTH_32F, 1); IplImage *vel_y = cvCreateImage( size, IPL_DEPTH_32F, 1); // x,y,t方向の微分画像Ix,Iy,Itを格納するバッファの確保 IplImage *Ix = cvCreateImage( size, IPL_DEPTH_32F, 1); IplImage *Iy = cvCreateImage( size, IPL_DEPTH_32F, 1); IplImage *It = cvCreateImage( size, IPL_DEPTH_32F, 1); // 必要な計算をここに // オプティカルフローを求める for ( int i=0; i