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

イントロダクション

引き続き、OpenCVをいじり倒していきます。今度は「Ellipse」メソッドを使用して見ます。黒い背景のイメージを読み込んで単純にメソッドを使用して見ます。

<実行結果1>

ソース> ※Gitからダウンロードできます。

/**
 * メインメソッド、書き方は決まっている。
 * イメージファイルを読み込んで線を引く
 * 
 * @param argsプログラム引数
 */
public static void main(String[] args) {
	// 100x100の白いPNGからのデータを作成する
	Mat src = Imgcodecs.imread(OpenCVTest7.class.getResource("/images/black.png").getPath());
	Imgproc.ellipse(src
			, new Point(src.width() /2, src.height() / 2)
			, new Size(src.width() / 4, src.width() / 16)
			, 0     // angle
			, 0.0   // ??
			, 360.0 // 0と360度の間の弧を延長する
			, new Scalar(255, 0, 0) // BGRの値
			, 2   // thickness
			, 8   // lineType
			, 0); // Shift
	System.out.println(src.dump());
	// 自作のJFrame拡張クラス
	new ViewFrame(src);
}

よくわからないけど真ん中に輪っかができました。

今度はImgproc#ellipse()のパラメータを変更して実行します。

「new Size(src.width() / 4, src.width() / 4)」に変更します。

<実行結果2>

普通の丸になりました。今度は逆にして見ます。

new Size(src.width() / 16, src.width() / 4)

<実行結果3>

縦長になりました。第三引数のサイズの第一引数がX軸方向の幅、第二引数がY軸方向の幅を定義しているので「丸」が開店しているようなイメージになるのであろうと推測します。なんか推測ばかりで確証までなかなかたどり着きませんが。。。次は連続してラベルを表示して見ます。その際にEllipseの値を変更して追加します。

	/**
	 * メインメソッド、書き方は決まっている。
	 * イメージファイルを読み込んで線を引く
	 * 
	 * @param argsプログラム引数
	 */
	public static void main(String[] args) {
		// 100x100の白いPNGからのデータを作成する
		Mat src = Imgcodecs.imread(OpenCVTest7.class.getResource("/images/black.png").getPath());
		src = ellipseLabel(src, 4, 16);
		System.out.println(src.dump());
		// 自作のJFrame拡張クラス
		ViewFrame frame = new ViewFrame(src);
		sleepFrame();
		frame.updateLabel(ellipseLabel(src, 16, 4));
		sleepFrame();
		frame.updateLabel(ellipseLabel(src, 2, 4));
	}

	private static Mat ellipseLabel(Mat src, int left, int right) {
		Imgproc.ellipse(src
				, new Point(src.width() /2, src.height() / 2)
				, new Size(src.width() / left, src.width() / right)
				, 0     // angle
				, 0.0   // ??
				, 360.0 // 0と360度の間の弧を延長する
				, new Scalar(255, 0, 0) // BGRの値
				, 2   // thickness
				, 8   // lineType
				, 0); // Shift
		return src;
	}

	private static void sleepFrame() {
		try {
			Thread.sleep(3000L);
		} catch(Exception e) {
			e.printStackTrace();
			System.exit(-1);
		}

	}

 

	/** 引っ越し2018/11/23 */
	private final JLabel label;
	
	public ViewFrame(Mat image) {
		// 受け取ったMatを表示する
		super("Show Image");
		// JFrameのメソッドを呼び出す(親クラス)
		Container con = super.getContentPane();
		
		// 入力ストリームを用意する
		BufferedImage buf = getIconImage(image);
		// ラベルをフィールドに持っていく 2018/11/23
		label = new JLabel(new ImageIcon(buf));
		con.add(label);
		// JFrameを閉じるときにアプリケーションも終わるようにする
		super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// コンポーンエントの配置を整理する
		super.pack();
		// JFrameを表示する(これをやらないと何も表示されない)
		setVisible(true);
	}

	private BufferedImage getIconImage(Mat image) {
		// イメージのバイト配列を受ける変数
		MatOfByte bytes = new MatOfByte();
		// 上の変数にpngファイルを書き込む
		Imgcodecs.imencode(".png", image, bytes);
		// プリミティブ型に変換
		byte[] b = bytes.toArray();
		// 入力ストリームを用意する
		InputStream in = new ByteArrayInputStream(b);
		
		BufferedImage buf = null;
		try {
			// イメージとして読み込む
			buf = ImageIO.read(in);
		} catch(IOException e) {
			e.printStackTrace();
		}
		return buf;
	}
	/**
	 * 引数のMat(イメージ)でラベルを更新します。
	 * @param img Mat
	 */
	public void updateLabel(Mat img) {
		label.setIcon(new ImageIcon(getIconImage(img)));
	}

<実行結果4>


今回はここまでにしておきます。

関連ページ一覧

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

OpenCv

  1. Java 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クラスで描画処理〜
  8. Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
  9. Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
  10. Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
  11. Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
  12. Java OpenCV Lv9 〜画像の掛け算〜
  13. Java OpenCV Lv10 〜行列演算Mat#submat()〜
  14. Java OpenCv Lv10〜画像の平均値をだす〜