画像を回転するには、アフィン変換という処理を行います。
Imgproc.getAffineTransform()メソッドで変換元と変換先の3点を指定して変換行列を計算し、Imgproc.warpAffine()メソッドで実際に変換を実行します。
Imgproc.getAffineTransform(List<Point> src, List<Point> dst)
List<Point> src 変換元の3点
List<Point> dst 変換先の3点
「Point」クラスはdouble値を2つメンバに持つクラスで、主に点座標を表します。
Imgproc.warpAffine(Mat src, Mat dst, Mat M, Size dsize,
int flags, int borderMode, Scalar borderValue)
Mat src 処理したい元画像のMat
Mat dst 変換後Mat
Mat M 2×3の変換行列
Size dsize 変換後Matのサイズ
int flags 補間手法
int borderMode ピクセル外挿手法
Scalar borderValue 定数境界モードで利用されるピクセル値
下の3つの引数は正直よく分からないのですが、省略出来るのでちょっと先送りします。
それでは実際にやってみましょう。
//変換元Matを使いまわすとエラーになるため、 //同じサイズのMatを用意します。 Mat dstMat = mat.clone(); //変換元の3点 List<Point> src_pt = new ArrayList<Point>(); src_pt.add(new Point(200, 200)); src_pt.add(new Point(250, 200)); src_pt.add(new Point(200, 100)); //変換先の3点 List<Point> dst_pt = new ArrayList<Point>(); dst_pt.add(new Point(300, 100)); dst_pt.add(new Point(300, 50)); dst_pt.add(new Point(200, 100)); //アフィン変換行列を計算 Mat affineTrans = Imgproc.getAffineTransform(src_pt, dst_pt); //変換 Imgproc.warpAffine(mat, dstMat, affineTrans, dstMat.size());今回から画面はlandscapeでキャプチャします。
まずは元画像。
変換後。
変換先の座標を少し変えて角度を変えてみます。
List<Point> dst_pt = new ArrayList<Point>(); dst_pt.add(new Point(300, 70)); dst_pt.add(new Point(300, 50)); dst_pt.add(new Point(200, 100));
3点であらわした三角形の形が変わると、画像も合わせて歪む訳ですね。
次回は後半3つの引数について実験してみます。
0 件のコメント:
コメントを投稿