参考にするサイトはこちらです。
実はPython版のチュートリアルなのですが、これをJavaに置き換えて学んでいきます。。。(Java版だと動画からしか見つからなかった〜)
基本1
参考サイトによると以下の内容を学びます。
- 画素値のアクセス及び変更方法
- 画像の属性情報の取得
- 画像中の注目領域(ROI)の設定
- 画像の分割と統合
まず初めにカラー画像を読み込みましょう:
とりあえずはその通りに、実装してみます。
作成したクラスは下のクラスです。準備で実装したCommandIFを実装(implements)したクラスを作成しました。
<CommandIFについて>
CommandIFは自作のインターフェースです。。。表示画面上部のテキストボックスに入力した文字列で起動するCommandIFを実装したクラスの「execute()」メソッドを実行します。
実行結果は下のような感じです。
CommandIF(インタフェース)を使用したポリモーフィズムの実行動画があります。
使用しているCanvasのサイズが200x200なのではみ出しています。。。
実行するコードはこんな感じです。
<CommandIF>
/**
* コマンド実行するためのインターフェース・クラス。
*
* @author takunoji
*
* 2020/05/17
*/
public interface CommandIF {
/** Canvasクラスから取得したGraphics2Dに描画する */
public abstract void execute(Pane pane) throws Exception;
/** 実装クラスを取得する */
public abstract CommandIF getCommand();
/** 描画したCanvasを取得する */
public abstract Canvas getBefore() throws Exception;
public abstract Canvas getAfter() throws Exception;
public abstract GraphicsContext getBeforeGraphics();
public abstract GraphicsContext getAfterGraphics();
public abstract BufferedImage getBeforeImage();
public abstract BufferedImage getAfterImage();
}
<CommandIF実装(implementsクラス>
@Override
public void execute(Pane pane) throws Exception {
ObservableList<Node> obsList = pane.getChildren();
Canvas before = null;
for (Node node : obsList) {
before = (Canvas) node.lookup("#testCanvasBefore");
}
// イメージファイルパスを取得する
URL url = getClass().getResource("/himawari.png");
// イメージファイルをロードして行列(Mat)に格納
Mat img = Imgcodecs.imread(url.getPath(), Imgcodecs.IMREAD_COLOR);
MatOfByte bikeByte = new MatOfByte();
// 画像データをMatOfByteに書き込む
Imgcodecs.imencode(".jpeg", img, bikeByte);
// BuffereImageを取得する
BufferedImage outImage = ImageIO.read(new ByteArrayInputStream(bikeByte.toArray()));
// Canvasへの描画準備
GraphicsContext g = before.getGraphicsContext2D();
// 描画ポイントを指定して描画する
g.drawImage(SwingFXUtils.toFXImage(outImage, null), 0, 0);
}
これで、起動できるのは、CommandIFの実装によるところです。
詳細はこちらの記事に記載しております。
大まかな作りは、下のような感じです。
OpenCVの処理
ようやく、本題に入ります。
OpenCVでの基本ということで、まずは「画像を描画する」というところに焦点を置き実装しました。
Javaでの実装の場合はテクノロジー的には以下のものを使用します。
- java.awt(描画関連API)
- java.io(入出力関連API)
- opencvライブラリ
具体的には、以下の通りです。番号で上のリストと対応しています。
- BufferedImage(java.awt.image)
- ByteArrayInputStream(java.io)
- Imagcodecs(org.opencv.core.imagecodecs)
描画処理の部分
- イメージをロード(読み込み)してMatクラスを取得
- javafxの部品を使用してCavasよりGraphicContextを取得
- Mat(画像データ)を描画しています。
早い話が、イメージファイルを読み取ったら、それをCanvasに書き込んでいる処理です。
上のキャプチャはキャンバスサイズが読み込んだ画像よりも小さかったので、表示した時に中途半端なことになりました。
あまり詰め込んでも仕方ないので今回はここまでにします。
あー頭イタイ。。。