透視変換を行うには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 件のコメント:
コメントを投稿