//---------------------------------------------------------
// 概要      : 画像の回転を行う
// File Name : rotate.cpp
// Library   : OpenCV for MS-Windows 1.0
//---------------------------------------------------------

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

#define ANGLE 60.0	//	回転角度
#define SCALE 0.8	//	画像の拡大率

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 center = cvPoint2D32f( sourceImage->width / 2.0, sourceImage->height / 2.0);	//回転中心

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

	//	変換行列を求める
	cv2DRotationMatrix( center, ANGLE, SCALE, rotationMatrix);

	//	画像の拡大、縮小、回転を行う
	cvWarpAffine( sourceImage, destinationImage, rotationMatrix, 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;
}

