最終更新: mikk_ni3_92 2007年12月10日(月) 17:17:28履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::透視投影変換
#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);
}
#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);
}