イントロダクション
やってきました、大敵!今回は「行列計算処理」をやります。そして今までのやったことを少し整理します。
下のリンクにあるように環境構築に始まり
- 画像の表示
- 画像の平滑化処理(smooth(), gaussianBlur(), medianBlur())
- 描画処理(線を引く、Ellipse処理(中途半端ですが。。。)
- 部分的な画像修正(描画)処理
という順番で学習してきました。そして、今回は画像=行列(Matクラス)の処理を少し掘り進んでみようというわけです。
環境構築
- Java OpenCV 環境セットアップ(on Mac)
- Java Install Eclipse〜開発ツールのインストール〜
- Java OpenCv Hello in Java〜OpenCv事始め〜
今までにやったこと(OpenCV編)
- Java OpenCV 環境セットアップ(on Mac)
- Java OpenCv Lv1 〜入門: 写真の表示〜
- Java OpenCV Lv2 〜画像を表示する〜
- Java OpenCV Lv3 〜画像の平滑化(smooth())〜
- Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
- Java OpenCV Lv4 〜画像の中身をみてみる〜
- Java OpenCV Lv5 〜Matクラスで描画処理〜
- Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
- Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
- Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
- Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
- Java OpenCV Lv9 〜画像の掛け算〜
- Java OpenCV Lv10 〜行列演算Mat#submat()〜
- 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」になってしまい白くなった。。。
こんなところでしょうか?ほんとは元のイメージに落書きのイメージが表示されると思ったのですが。。。
次回は、「引き算」をやります。