Javaでクロス!モンハンじゃないよ?

Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜

イントロダクション

やってきました、大敵!今回は「行列計算処理」をやります。そして今までのやったことを少し整理します。

下のリンクにあるように環境構築に始まり

  1. 画像の表示
  2. 画像の平滑化処理(smooth(), gaussianBlur(), medianBlur())
  3. 描画処理(線を引く、Ellipse処理(中途半端ですが。。。)
  4. 部分的な画像修正(描画)処理

という順番で学習してきました。そして、今回は画像=行列(Matクラス)の処理を少し掘り進んでみようというわけです。

環境構築

  1. Java OpenCV 環境セットアップ(on Mac)
  2. Java Install Eclipse〜開発ツールのインストール〜
  3. Java OpenCv Hello in Java〜OpenCv事始め〜

今までにやったこと(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)

行列=Matクラスの四則計算

まずはデフォルト表示

<実行結果:画像表示の確認>

まずは、そのままの(加算処理をしない状態の)画像を確認します。

<ソース1>

public static void main(String[] args) {
	long start = System.currentTimeMillis();
	// 100x100の白いPNGからのデータを作成する
	Mat src = Imgcodecs.imread(OpenCVTest9_Add.class.getResource("/images/Experience.png").getPath());
	ViewFrame frame = new ViewFrame(src);
	System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");
}

シンプルに画像を読み込んで、SwingのLabelに表示するだけです。

加算処理

<加算する画像>事情により自分で作成したため微妙ですが。。。

<参考サイト>

画像を合体させる

Java API(OpenCV)#cvAdd ※Coreクラスにありました。

<実行結果:行列(Mat)に下の画像を追加します>

エラーになりました。以下のような文言が出力されました。

neither 'array op array' (where arrays have 
the same size and the same number of channels)
, nor 'array op scalar'
, nor 'scalar op array' in function 'arithm_op'



そんなわけで、イメージファイルを変更します。

元にするファイル=>

加算するファイル=>

ちなみに出力する画像データを見ている関係で画像ファイルが小さいです。(50x50)

<実行結果>

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

public static void main(String[] args) {
	long start = System.currentTimeMillis();
	// 100x100の白いPNGからのデータを作成する
	Mat src = Imgcodecs.imread(OpenCVTest9_Add.class.getResource("/images/cart2.png").getPath());
	Mat cart = Imgcodecs.imread(OpenCVTest9_Add.class.getResource("/images/rakugaki.png").getPath());
	Mat dst = new Mat();
	Core.add(src, cart, dst);
	ViewFrame frame = new ViewFrame(dst);
	System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");
}

赤い字の部分をソースに追加しました。そして、ほとんど消えてしまいました。

足し算したはずなのになんででしょうか?

元のイメージのデータ(Matの中身)※一部

足し算後のデータ ※一部

単純に足し算した結果値が「255」になってしまい白くなった。。。

こんなところでしょうか?ほんとは元のイメージに落書きのイメージが表示されると思ったのですが。。。

次回は、「引き算」をやります。

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す