酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

OpenCVで透視投影変換する

cvGetPerspectiveTransform関数とcvWarpPerspective関数を使って、透視投影変換させてみました。

OpenCV for Windows Phoneのテストのために透視投影変換を実装してみましたが、Windows Phoneに依存する部分がない(とても少ない)ため、その他のプラットフォームでも利用することができると思います。

static void warpPerspective(IplImage* srcImage, IplImage* dstImage)
{
	CvMat* map_matrix;
	CvPoint2D32f src_pnt[4], dst_pnt[4];
	src_pnt[0] = cvPoint2D32f(0.0, 0.0);
	src_pnt[1] = cvPoint2D32f(0.0, 1024.0);
	src_pnt[2] = cvPoint2D32f(1024.0, 1024.0);
	src_pnt[3] = cvPoint2D32f(1024.0, 0.0);

	dst_pnt[0] = cvPoint2D32f(200.0, 200.0);
	dst_pnt[1] = cvPoint2D32f(0.0, 1024.0);
	dst_pnt[2] = cvPoint2D32f(1024.0, 1024.0);
	dst_pnt[3] = cvPoint2D32f(300.0, 200.0);

	map_matrix = cvCreateMat(3, 3, CV_32FC1);
	cvGetPerspectiveTransform(src_pnt, dst_pnt, map_matrix);
	cvWarpPerspective(srcImage, dstImage, map_matrix, 
		CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, cvScalarAll(100));
}

上記のコードを実行すると、下図のように猫が伸びている画像が得られます。

f:id:ch3cooh393:20130125151523p:plain

ただこの処理、1回あたりの実行時間が、697ミリ秒とあんまり多用するものではなさそうです。100ミリ秒~200ミリ秒で実行できるようになれば、電子書籍的なページの「めくり」が実装できそうな気もするのですが……