OpenCv 画像編集 〜プログラマ的デザイン手法〜

イントロダクション

目標達成プロジェクトを作成し、目標ブレークを行った時の目標のカテゴリ分けをわかりやすくするため(わかりづらくなったらごめんなさい)。

カテゴリをイメージにしました。やったことのない「デザイン(イメージのデザイン)」を四苦八苦しながらやりました。

正確には「イメージの部品」を作成しました。作成したものはGitにアップしました。

OpenCVで画像を重ねる

元にしたコードは以前やったものを持ってきました。環境のセットアップも見直しました。

ちょいと注意しなくてはいけないのが以下の点になります。

  1. 「画像ファイル名は日本語ではエラーになる」
  2. EclipseNativeLibraryの設定

ここを見直しておくと「は?」とならないと思われます。

そして実行して困ったのが、表示したものが「黒くなっている」ということでした。どうやら「0」が「透過=黒」になっている様でMatのチャンネルを4つにしなくてはいけない様です。

実行した結果

はこんな感じです。サイズが「60 x 60」なので小さいです。

実行したコードは下の様な感じです。Gitで完全なコードが観れます。

long start = System.currentTimeMillis();
///// 画像読込 /////
// レベル0カテゴリ
Mat src = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/categories/" + "1_create.png").getPath(), Imgcodecs.IMREAD_UNCHANGED);
// レベル1カテゴリ
Mat cart = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/categories/" + "A_design.png").getPath(), Imgcodecs.IMREAD_UNCHANGED);
// レベル2カテゴリ
Mat cart1 = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/categories/" + "a_artifacts.png").getPath(), Imgcodecs.IMREAD_UNCHANGED);
System.out.println("*** First ****");
// 出力用、画像(行列を表すクラス)
Mat dst = new Mat();
// 元の画像に重ねていく
Core.addWeighted(src, 0.5, cart, 0.5, 0, dst);
Core.addWeighted(dst, 0.5, cart1, 0.5, 0, dst);
System.out.println("*** Second ****");
Imgcodecs.imwrite("/dst/1Aa.png", dst);
ViewFrame frame = new ViewFrame(dst);
System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");

シンプルに画像を読み込んで、重ねていく処理です。OpenCvは、参考書などを読むと無茶苦茶難しいですが、部分的に使うなら問題なく使えました。

そして、こいつを理解すれば機械学習も怖くない(笑)

でわでわ。。。