# OpenGL de プログラミング

### 問題

#### 答え

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

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に表示されております。

― その他 ―

## Save The World

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

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