Java OpenCV学習履歴 〜環境構築からサンプル実装〜

Java版 OpenCV

TensorFlowの機械学習を学んだけれど、よくわからずじまいだったのでOpenCVでの計算処理などの内容を理解することから始めていこうと思いました。
画像処理ライブラリなので、画像認証なども実装されています。

OpenCVのインストール(makeコマンドを使う)

コマンドを叩いてOpenCVをインストールしました。Elipseを使用して開発を行いました。
ビルドパス、ネイティブライブラリの設定などを行いました。

Java OpenCv Hello in Java〜OpenCv事始め〜

OpenCVの事始め「ハローワールド」を行います。
ポイントとしては、OpenCVのライブラリを読み込み携帯で撮った写真「レシート」を読み取り、画面に表示するというものです。

Java OpenCv Lv1 〜入門: 写真の表示〜

Pythonの実装では、HighGUIというアプリケーション(コマンド)で画像表示を行なっていますが、Java版はJavaFXを使用します。なのでJavaFXのセットアップも行います。

Java OpenCV Lv2 〜JavaFXでの画像表示〜

JavaFX + OpenCVでの画像表示処理を実装しました。
途中エラーが出ましたが、なんとか解消することができました。

Java OpenCV Lv3 〜画像の平滑化(smooth())〜

画像処理の実行を行います。画像解析に使用するメソッドのようで「平滑化」という処理を実行して見ました。
画像をぼかす処理でしたが、この処理を行うことで「輪郭がぼやける」=「境界値の差が縮まる」ということのようです。

Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜

ガウシアンフィルターは「注目画素」を基準にしてそこからの距離によりボケ方を変えるものなようです、「だから何よ?」と言われると自分にもわかりませんでした。。。

Java OpenCV Lv3 〜画像に中央値フィルタ(medianBlur())〜

ここまでくると、ターゲットにする色(画素)に対してボケ方を調整しているのだということが理解できました。
「ノイズを除去するのにしようする」と書籍には記載がありましたが、機械学習的な目線でいくと「特徴量」に対して何かしらのアプローチができそうです。

Java OpenCV Lv4 〜画像の中身をみてみる〜

画像データの生データ(プログラム的なデータ)をコンソールに表示して見ました。画像は2次元配列になっていてそれぞれの位置(x[横], y[縦])に対して色の値が入っていることがわかりました。

Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜

「画像処理を行う」ということを大まかに理解できた時の記事になります。ここでは、画像の背景を除去する処理を行いました。

Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜

Ellipseメソッドを使用してその結果を見て見ます。「エクリプス」ではないので注意です。
青い輪っかの画像を回転させる処理でした、なんか画像処理って感じの処理で面白かったです。

Java OpenCV Lv8 〜ROIについて〜

画像認証に近づいていきます。
ROIというのは「指定の範囲をターゲッチングする」処理のことで、例えば人の顔を見つけようとした時に検証する画像の範囲(ROI)を指定するというものです。

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

画像の足し算を行います。
単純に画像Aと画像Bを合成する。。。というイメージを持っていたのですが、画素の足し算処理だったようです。

Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜

上の記事では足し算の意味(用途)がイマイチわからなかったので復讐ではないけれど、少し掘り下げて見ました。
そして同様に引き算処理も行って見ました。
やっぱり「画素の加減算」のようでした。

Java OpenCV Lv9 〜画像の掛け算〜

「掛け算」だと思っているのですが、「アルファブレンド」と記載があったのでアルファブレンドの処理を行って見ました。
この記事は画像のA,Bを合成するという処理になります。

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

画像が「ピクセル数 x ピクセル数」の配列になっているのでそれを行列として見てみると理解がしやすいです。
そして、その行列の指定位置の画像を切り抜くという処理が「submat()」でした。

Java OpenCV Lv10 〜画像の論理演算〜

画像の論理演算は画像を合成するようなイメージです。
アルファブレンドと同じような感じですが、用途が違うのでしょうか?その部分は自分は、わかりませんでした。

Java OpenCv Lv10〜画像の平均輝度をだす〜

正直のところよくわかりませんでした。とりあえずわかったのは、四角の画像が背景と同じような色になったということくらいです。

Java OpenCv ビデオキャプチャ〜カメラからの入力を表示〜

JavaFXらしい処理になります。カメラで取り込んだ画像を表示します。
デジタルカメラの撮影前のような画像を表示します。

まとめ

こんな感じでOpenCVを学習して見ましたが、機械学習の理解までは届かずじまいでした。
しかし、画像のデータのようにたくさんのデータを処理するというところは一緒なので、以下のような解析処理は実装できそうです。

一年の降水量調査結果を(x=月, y=降水量)としてグラフにした時

  1. 書く値に対してぼかし処理を入れるとグラフの上下差が縮まる
  2. ぼかし方を変更してやることもできる

ここからはまだまだ理解を深めていく必要があります。

でわでわ。。。。