酢ろぐ!

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

Windows PhoneでOpenCVを使って透視投影変換する

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));
}

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

f:id:ch3cooh393:20130125151523p:plain

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