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

イントロダクション

前回はMatクラスを使用して描画処理を行って見ました。ただし、背景のイメージファイルを読み込んで起動、一からのイメージ作成はしていませんでした。

今回は、Matクラスでイチからイメージを作成してみようと思います。

<今までの記事>

  1. ava OpenCV 環境セットアップ(on Mac)
  2. Java OpenCv Lv1 〜入門: 写真の表示〜
  3. Java OpenCV Lv2 〜画像を表示する〜
  4. Java OpenCV Lv3 〜画像の平滑化(smooth())〜
  5. Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
  6. Java OpenCV Lv4 〜画像の中身をみてみる〜
  7. Java OpenCV Lv5 〜Matクラスで描画処理〜

Gitからのプロジェクト取得


やることはすごくシンプル

Matクラスをnewするときにちゃんとパラメータを渡してあげるだけです。

引数に画像のサイズ(int, int)「CvType.CV_8UC1」を渡してやるだけです。そして左のリンクページの記事より、扱えるチャネル(Channel)は1つということで。。。

色は黒と白のみなのであろう(予想)と思いました。

<実行結果1:CV_8UC1>

<ソース>

public static void main(String[] args) {
	// 100x100の白いPNGからのデータを作成する
//	Mat src = Imgcodecs.imread(OpenCVTest6.class.getResource("/images/black.png").getPath());
	Mat src = new Mat(50, 50, CvType.CV_8UC1);
	Point pt1 = new Point(0,0);
	Point pt2 = new Point(50,50);
	Imgproc.line(src, pt1, pt2, new Scalar(240, 255, 240), 1);
	System.out.println(src.dump());
	// 自作のJFrame拡張クラス
	new ViewFrame(src);
}

ちなみに白(255)で試してもゴミ(ノイズ?)が出ていました。

これは指定した色、他のプロパティ(Channelなど)が「CV_8UC1」に対応していないためと予想します。そんなわけで、CV_8UC2で起動しました。

エラーが出て以下の文言が見当たりました。

channels == 1 || channels == 3 || channels == 4 in function 'imencode'

どうやらチャネル数は1,3,4のどれかでなくてはならないようです。

改めて「CV_8UC3」で勝負!

<実行結果2:CV_8UC3>

動いたけど、ゴミはまだ残っています。そして、実行結果1と比べて少しカラフルになりました。ついでなのでCV_8UC4も実行して見ます。

<実行結果4>

おお!背景の「黒」が消えた!!ついでだから他のものも。。。

【補足】上記の「ソース」の赤い字の部分のみを変更して実行しています。

<実行結果5:CV_8SC1>

<実行結果6:CV_8SC3>

<実行結果7:CV_8SC4>

ここまでやったら、XX4は黒が透明になルようだと推定します。

<実行結果8:CV_16UC3>

おお!綺麗に線が引けた感じがする。。データは下のようになりました。

理由はよくわからないが、8XXだとゴミが入るけど16XXの時はゴミが入らなそうだ。

関連ページ一覧

  1. Java OpenCV 環境セットアップ(on Mac)
  2. Java Install Eclipse〜開発ツールのインストール〜
  3. Java OpenCv Hello in Java〜OpenCv事始め〜