現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::透視投影変換

問題


以下の画像を読み込んで、透視投影変換を行え。

その他条件:
 「1」、「2」キーで傾き具合を切り替える。

画像

答え


#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;


/*** プロトタイプ宣言 ***/
void SET_REC_DATA(CvPoint2D32f *before,const IplImage *imgA);
void CALC_AFTER_DATA(CvPoint2D32f *after,const IplImage *imgA);


/*** 外部変数 ***/
double MOVE;
double aspect;


int main( int argc, char **argv)
{

IplImage *imgA = cvLoadImage( "road.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(imgA ==NULL)
{
cout<<"Can't Load Image ." << endl;
std::exit(0);
}

IplImage *imgB = cvCloneImage (imgA);


cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);

cvNamedWindow("window2",CV_WINDOW_AUTOSIZE);
cvShowImage("window2",imgB);

/*計算用 点データ*/
CvPoint2D32f before[4], after[4];
SET_REC_DATA(before,imgA);


aspect = double(imgA->height) / double(imgA->width);

char key;
CvMat *map_matrix;
map_matrix = cvCreateMat (3, 3, CV_32FC1);

while(1)
{
key=(char)cvWaitKey(0); // 0秒待つ => ずっと入力待ち
if(key == '1')
{
MOVE+=10;
}else if(key == '2')
{
MOVE-=10;
}else if (key == '\033') //ESCキー
{
break;
}

/** 透視投影の計算 **/
CALC_AFTER_DATA(after,imgA);
cvGetPerspectiveTransform (before, after, map_matrix);
cvWarpPerspective (imgA, imgB, map_matrix, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, cvScalarAll (100));


cvShowImage("window2",imgB);
}


cvReleaseImage( &imgA );
cvDestroyWindow("window");

cvReleaseImage( &imgB );
cvDestroyWindow("window2");


return 0;
}


void SET_REC_DATA(CvPoint2D32f *before,const IplImage *imgA)
{
before[0] = cvPoint2D32f (0.0, 0.0);
before[1] = cvPoint2D32f (0.0, double(imgA->height));
before[2] = cvPoint2D32f (double(imgA->width),double(imgA->height));
before[3] = cvPoint2D32f (double(imgA->width), 0.0);
}


void CALC_AFTER_DATA(CvPoint2D32f *after,const IplImage *imgA)
{
after[0] = cvPoint2D32f (MOVE*aspect, MOVE*2);
after[1] = cvPoint2D32f (0.0, double(imgA->height));
after[2] = cvPoint2D32f (double(imgA->width),double(imgA->height));
after[3] = cvPoint2D32f (double(imgA->width) - MOVE*aspect, MOVE*2);
}

メモ


擬似3D。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます