2012年2月22日水曜日

画像を回転する その1 - OpenCV for Android


画像を回転するには、アフィン変換という処理を行います。

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 コメント:

コメントを投稿