イントロダクション
引き続き、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>
今回はここまでにしておきます。
関連ページ一覧
- Java OpenCV 環境セットアップ(on Mac)
- Java Install Eclipse〜開発ツールのインストール〜
- Java OpenCv Hello in Java〜OpenCv事始め〜
OpenCv
- Java OpenCV 環境セットアップ(on Mac)
- Java OpenCv Lv1 〜入門: 写真の表示〜
- Java OpenCV Lv2 〜画像を表示する〜
- Java OpenCV Lv3 〜画像の平滑化(smooth())〜
- Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
- Java OpenCV Lv4 〜画像の中身をみてみる〜
- Java OpenCV Lv5 〜Matクラスで描画処理〜
- Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
- Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
- Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
- Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
- Java OpenCV Lv9 〜画像の掛け算〜
- Java OpenCV Lv10 〜行列演算Mat#submat()〜
- Java OpenCv Lv10〜画像の平均値をだす〜