2012年3月4日日曜日

透視変換を行う - OpenCV for Android


透視変換を行うにはImgproc.getPerspectiveTransform()メソッドで変換元と変換先の4点を指定して変換行列を計算し、Imgproc.warpPerspective()メソッドで変換します。

Imgproc.getPerspectiveTransform(Mat src, Mat dst)

Mat src  変換元の四角形のMat
Mat dst  変換先の四角形のMat


Imgproc.warpPerspective(Mat src, Mat dst, Mat M, Size dsize, int flags, int borderMode, Scalar borderValue)

引数はImgproc.warpAffine()メソッドと同じなので省略します。


まずはgetPerspectiveTransform()の引数となるMatを作成します。
4つのPointを持つArrayListを作成し、Convertersクラスのメソッドvector_Point_to_Mat()でMatへ変換します。
この際、タイプをCV_32FかCV_64Fに指定する必要があります。
ここでかなりハマりました。

List<point> srcPoints = new ArrayList<point>(4);
srcPoints.add(new Point(150,150));
srcPoints.add(new Point(150,300));
srcPoints.add(new Point(350,300));
srcPoints.add(new Point(350,150));
Mat srcPointsMat = Converters.vector_Point_to_Mat(
  srcPoints, CvType.CV_32F);

List<point> dstPoints = new ArrayList<point>(4);
dstPoints.add(new Point(200,150));
dstPoints.add(new Point(200,300));
dstPoints.add(new Point(340,270));
dstPoints.add(new Point(340,180));
Mat dstPointsMat = Converters.vector_Point_to_Mat(
  dstPoints, CvType.CV_32F);


ついでにborderModeを指定してみましょう。
Imgproc.warpPerspective(mat, dstMat, affineTrans,
  dstMat.size(), Imgproc.INTER_LINEAR,
  Imgproc.BORDER_REFLECT);


それっぽくなりましたが分かりづらいので、Chromeアイコンでもやってみましょう。



うまくいってますね。

0 コメント:

コメントを投稿