Java OpenCV Lv10 〜行列演算Mat#submat()〜

イントロダクション

Lv9では、画像(行列=Mat)の足し算と引き算、アルファブレンド(掛け算?)をやりました。

ここからは、ドラクエⅢ的にいうならば地下世界に突入します。

Lv9でやった「足し算」と「引き算」はバラモスのようなものでまぁ本番前の前哨戦と言ったところです。

今回の目玉

Lv9の処理でやったものは条件があり、演算するときにサイズを同じにする必要があります。(50x50, 100x100など)これはあまり実践的ではありませんので「策」が必要です。

「策」とは?

シンプルに、画像のサイズが違うなら一部を抜き出してしまえば良いのです。 ※調べているうちに気がつきました(笑)

つまりMat#subMat()を使用するということです。

ちょっと手こずりましたが、基本ですね。。。何が言いたいかというと

今回使用したMat#submat()は抜き出したMat(ROI)の参照を持っているのでいちいち変換処理の後に元の画像データに戻してやる必要がない(※参照渡しになっている)ということでした。参考サイトはstackoverflow

<実行結果>



<ソース> ※Gitからダウンロードできます

public static void main(String[] args) {
	long start = System.currentTimeMillis();
	// mountain.png(798x503)
	Mat src = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/images/mountain.png").getPath());
        // rakugaki.png(50x50)
	Mat cart = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/images/racgaki2.png").getPath());
	Rect rect = new Rect(600, 400, 50, 50);
        // 変更したい部分を切り抜く
	Mat roi = src.submat(rect);
	// 抜き出した部分に掛け算を行う(アルファブレンドを行う)
	Core.addWeighted(roi, 0.5, cart, 0.5, 0, roi);
               // 掛け算を行なったとき、元の画像データの抜き出した部分を変更しているので「src」をそのまま表示
	ViewFrame frame = new ViewFrame(src);
	System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");
}

関連ページ一覧

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)

今までにやったこと(OpenCV編)

  1. Java OpenCV 環境セットアップ(on Mac)
  2. Java OpenCv Lv1 〜入門: 写真の表示〜
  3. Java OpenCV Lv2 〜画像を表示する〜
  4. Java OpenCV Lv3 〜画像の平滑化(smooth())〜
  5. Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
  6. Java OpenCV Lv4 〜画像の中身をみてみる〜
  7. Java OpenCV Lv5 〜Matクラスで描画処理〜
  8. Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
  9. Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
  10. Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
  11. Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
  12. Java OpenCV Lv9 〜画像の掛け算〜
  13. Java OpenCV Lv10 〜行列演算Mat#submat()〜
  14. Java OpenCv Lv10〜画像の平均値をだす〜

重宝するページ:JavaDoc(opencv-343.jar API)