イントロダクション
目標達成プロジェクトを作成し、目標ブレークを行った時の目標のカテゴリ分けをわかりやすくするため(わかりづらくなったらごめんなさい)。
カテゴリをイメージにしました。やったことのない「デザイン(イメージのデザイン)」を四苦八苦しながらやりました。
正確には「イメージの部品」を作成しました。作成したものはGitにアップしました。
OpenCVで画像を重ねる
元にしたコードは以前やったものを持ってきました。環境のセットアップも見直しました。
ちょいと注意しなくてはいけないのが以下の点になります。
- 「画像ファイル名は日本語ではエラーになる」
- EclipseのNativeLibraryの設定
ここの記事見ておくと「は?意味わからん…」とならないと思われます。
そして実行して困ったのが、表示したものが「黒くなっている」ということでした。どうやら「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は、参考書などを読むと無茶苦茶難しいですが、部分的に使うなら問題なく使えました。
そして、こいつを理解すれば機械学習も怖くない(笑)
でわでわ。。。
関連ページ
- OpenCV記事一覧
- Java OpenCV 〜輪郭:輪郭検出処理の順序〜
- Java OpenCV 〜画像の一部分を書き換える〜
- OpenCV エラー 〜Sizes of input arguments do not match〜
- Java OpenCV 〜基礎: 画像上の基本的な処理〜
- Java OpenCV学習履歴 〜環境構築からサンプル実装〜