やっと分かった!画像のアフィン変換のキモ

最近は、OpenCVプログラミングブックを読み進めながら、例題のようにひとつづつコーディングして、動かしているところです。

アフィン変換のところで、

cvGetAffineTransform

という関数に、変換前後の3つの点を渡す記述があり、ようやく合点がいきました。

というのも、カメラキャリブレーションについて調べていたときに特徴点3つを特定せよといった記述があったような記憶があるのですが、考えてみると、同一直線上に無い3点から変換行列を求めることができるということだったんですね。勉強不足ですみません。。これからもっと行列について勉強したいと思います。

大事な概念だと自分では思うので、忘れないようにメモメモ。

 

#define TRANSLATE_X 100
#define TRANSLATE_Y 100

int _tmain(int argc, char *argv[])
{

	char *windowNameSource = "Source";
	char *windowNameDestination = "Destination";

    // **** 画像読み込み ****
	IplImage *sourceImg = cvLoadImage( "C:/OpenCV2.3/img/baboon.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);

	if(sourceImg == NULL){

		printf("画像が見つかりませんn");
		return -1;
	}

	IplImage *destinationImg = cvCreateImage(cvGetSize(sourceImg), IPL_DEPTH_8U, 3);


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

	original[0] = cvPoint2D32f(0,0);
	original[1] = cvPoint2D32f(sourceImg->height,0);
	original[2] = cvPoint2D32f(0,sourceImg->height);

	translate[0] = cvPoint2D32f(TRANSLATE_X,TRANSLATE_Y);
	translate[1] = cvPoint2D32f(TRANSLATE_X + sourceImg->width,TRANSLATE_Y);
	translate[2] = cvPoint2D32f(TRANSLATE_X,TRANSLATE_Y + sourceImg->height);


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


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


	//実際に変形を行う。
	cvWarpAffine(sourceImg, destinationImg, affineMatrix, CV_INTER_LINEAR|CV_WARP_FILL_OUTLIERS, cvScalarAll(0));


	cvNamedWindow(windowNameSource,CV_WINDOW_AUTOSIZE);
	cvNamedWindow(windowNameDestination,CV_WINDOW_AUTOSIZE);

	cvShowImage(windowNameSource,sourceImg);
	cvShowImage(windowNameDestination,destinationImg);


	cvWaitKey(0); // 0秒待つ => ずっと入力待ち


	cvReleaseImage( &sourceImg );
	cvReleaseImage( &destinationImg );


	cvDestroyWindow(windowNameSource);
	cvDestroyWindow(windowNameDestination);



	return 0;
}

コラム

OpenCVの勉強に購入した本です。どちらも良著だと思います。これから学ばれる人は是非参考にしてください!

OpenCV プログラミングブック 第2版 OpenCV 1.1対応 OpenCV プログラミングブック 第2版 OpenCV 1.1対応

「OpenCV プログラミングブック」は2版あるので気を付けてください。こちらが新しい方です。この本は実例が豊富ですので、OpenCVについて理解がしやすいです。一通り例題をこなすと、OpenCVについての知識が深まります。

 

 

 

詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識 詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識

分厚いですが、オライリー本の例にもれず、良著だと思います。上の本でOpenCVの面白さを知った人には、手放せない本になるはずです。

 

コメントを残す

サブコンテンツ

このページの先頭へ