cvGetPerspectiveTransform関数とcvWarpPerspective関数を使って、透視投影変換させてみました。
OpenCVを使って透視投影変換する
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)); }
上記のコードを実行すると、下図のように猫が伸びている画像が得られます。
ただこの処理、1回あたりの実行時間が、697ミリ秒とあんまり多用するものではなさそうです。100ミリ秒~200ミリ秒で実行できるようになれば、電子書籍的なページの「めくり」が実装できそうな気もするのですが……