イントロダクション
前回はMatクラスを使用して描画処理を行って見ました。ただし、背景のイメージファイルを読み込んで起動、一からのイメージ作成はしていませんでした。
今回は、Matクラスでイチからイメージを作成してみようと思います。
<今までの記事>
- ava OpenCV 環境セットアップ(on Mac)
- Java OpenCv Lv1 〜入門: 写真の表示〜
- Java OpenCV Lv2 〜画像を表示する〜
- Java OpenCV Lv3 〜画像の平滑化(smooth())〜
- Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
- Java OpenCV Lv4 〜画像の中身をみてみる〜
- 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の時はゴミが入らなそうだ。