//---------------------------------------------------------
// 概要      : 画像のアフィン変換を行う
// File Name : affine.cpp
// Library   : OpenCV for MS-Windows 1.0
//---------------------------------------------------------

#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

int main( int argc, char **argv ) {
	char windowNameSource[] = "Source";				//	元画像を表示するウィンドウの名前
	char windowNameDestination[] = "Destination";	//	変換後の画像を表示するウィンドウの名前

	//	画像を読み込む
	IplImage *sourceImage = cvLoadImage( "image/lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );

	if ( sourceImage == NULL ){
		//	画像が見つからなかった場合
		printf( "画像が見つかりません\n" );
		return -1;
	}

	//	画像を生成する
	IplImage *destinationImage = cvCreateImage( cvGetSize( sourceImage ), IPL_DEPTH_8U, 3 );	//	変換後の画像用IplImage

	CvPoint2D32f original[3];	//	変換前座標
	CvPoint2D32f translate[3];	//	変換後座標

	//	変換前の座標を設定する
	original[0] = cvPoint2D32f( 0, 0 );
	original[1] = cvPoint2D32f( sourceImage->width, 0 );
	original[2] = cvPoint2D32f( 0, sourceImage->height );

	//	変換後の座標を設定する
	translate[0] = cvPoint2D32f( 100, 200 );
	translate[1] = cvPoint2D32f( 400, 50 );
	translate[2] = cvPoint2D32f( 50, 450 );

	//	行列を生成する
	CvMat *affineMatrix = cvCreateMat( 2, 3, CV_32FC1);

	//	変換行列を求める
	cvGetAffineTransform( original, translate, affineMatrix );

	//	変換行列を反映させる
	cvWarpAffine( sourceImage, destinationImage, affineMatrix, CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS, cvScalarAll( 0 ) );

	//	ウィンドウを生成する
	cvNamedWindow( windowNameSource, CV_WINDOW_AUTOSIZE );
	cvNamedWindow( windowNameDestination, CV_WINDOW_AUTOSIZE );

	//	画像を表示する
	cvShowImage( windowNameSource, sourceImage );
	cvShowImage( windowNameDestination, destinationImage );

	//	キー入力を待つ
	cvWaitKey( 0 );

	//	画像を保存する
	cvSaveImage( "image/destination.bmp", destinationImage );

	//	メモリを解放する
	cvReleaseImage( &sourceImage );
	cvReleaseImage( &destinationImage );
	//	ウィンドウを破棄する
	cvDestroyWindow( windowNameSource );
	cvDestroyWindow( windowNameDestination );

  return 0;
}

