現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::擬似3D回転

問題


以下の画像を読み込んで、擬似的な3D回転を行え。

画像

答え


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

using namespace std;


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


/*** 外部変数 ***/
int r;


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

IplImage *imgA = cvLoadImage( "test2.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);




CvMat *map_matrix;
map_matrix = cvCreateMat (3, 3, CV_32FC1);
bool flag = true;

while(1)
{

cvWaitKey(41);
r+=11;

/** 透視投影の計算 **/
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);


if(r>360)r = 0;
}


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)
{

#define PI_OVER_180 0.0174532925
after[0] = cvPoint2D32f (0.0, 0.5*(double(imgA->height)*(-cos(r*PI_OVER_180)) + double(imgA->height)));
after[1] = cvPoint2D32f (0.0, 0.5*(double(imgA->height) + double(imgA->height)*cos(r*PI_OVER_180)));
after[2] = cvPoint2D32f (double(imgA->width),0.5*(double(imgA->height)+double(imgA->height)*cos(r*PI_OVER_180)));
after[3] = cvPoint2D32f (double(imgA->width), 0.5*(double(imgA->height)*(-cos(r*PI_OVER_180)) + double(imgA->height)));
}


メモ


cvwaitkey()でフレームを制御した。

afterで定義される矩形が直線になるとまずいようだ。

単振動っぽい感じ。
×

この広告は60日間更新がないwikiに表示されております。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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