Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java OpenCVライブラリで画像の輪郭を検出・描画する方法

輪郭(コンター)とは、特定の形状の境界線上にあるすべての点を結んでできた線のことです。輪郭を利用することで、以下のような処理が可能になります。

  • オブジェクトの形状を調べる
  • オブジェクトの面積を計算する
  • オブジェクトを検出する
  • オブジェクトを認識する

輪郭の検出には findContours() メソッド

画像内に含まれるさまざまな形状やオブジェクトの輪郭を検出するには、OpenCVが提供する findContours() メソッドを使用します。一般的には、あらかじめ画像をグレースケール化し、二値化処理を行ってから輪郭検出を実行すると、より正確な結果が得られます。

輪郭の描画には drawContours() メソッド

検出した輪郭を画像上に描画するには、drawContours() メソッドを使用します。このメソッドは以下のパラメータを受け取ります。

  • 結果画像を格納するためのMatオブジェクト
  • 検出された輪郭を格納したListオブジェクト
  • 描画する輪郭を指定する整数値(負の値を指定するとすべての輪郭を描画)
  • 輪郭の色を指定するScalarオブジェクト
  • 輪郭の線の太さを指定する整数値

サンプルコード

import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingContours {
    public static void main(String args[]) throws Exception {
        // OpenCVのコアライブラリを読み込む
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
        String file ="D:\\Images\\shapes.jpg";
        Mat src = Imgcodecs.imread(file);

        // ソース画像をグレースケールに変換
        Mat gray = new Mat(src.rows(), src.cols(), src.type());
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);

        // グレースケール画像を二値化
        Mat binary = new Mat(src.rows(), src.cols(), src.type(), new Scalar(0));
        Imgproc.threshold(gray, binary, 100, 255, Imgproc.THRESH_BINARY_INV);

        // 輪郭を検出
        List<MatOfPoint> contours = new ArrayList<>();
        Mat hierarchey = new Mat();
        Imgproc.findContours(binary, contours, hierarchey, Imgproc.RETR_TREE,
        Imgproc.CHAIN_APPROX_SIMPLE);

        // 輪郭を描画
        Scalar color = new Scalar(0, 0, 255);
        Imgproc.drawContours(src, contours, -1, color, 2, Imgproc.LINE_8,
        hierarchey, 2, new Point() ) ;

        HighGui.imshow("Drawing Contours", src);
        HighGui.waitKey();
    }
}

処理の流れの解説

このサンプルコードでは、まず Imgcodecs.imread() で画像を読み込み、cvtColor() メソッドでグレースケールに変換しています。次に threshold() メソッドで二値化処理を行い、findContours() によって輪郭を検出します。最後に drawContours() を使って、赤色(Scalar(0, 0, 255))・太さ2の線ですべての輪郭(第3引数に-1を指定)を元画像の上に描画し、結果をウィンドウに表示しています。

入力画像

Java OpenCVライブラリで画像の輪郭を検出・描画する方法

実行結果

上記のプログラムを実行すると、以下のように各図形の輪郭が赤い線で描画されたウィンドウが表示されます。

Java OpenCVライブラリで画像の輪郭を検出・描画する方法

  1. JavaのOpenCVライブラリでカラー画像をグレースケールに変換する方法

    カラー画像をグレースケールに変換する基本OpenCVのImgprocクラスが提供するcvtColor()メソッドを使うと、画像の色空間を別の色空間へ変換できます。このメソッドは以下の3つのパラメータを受け取ります。src – 変換元の画像を表すMatオブジェクト(ソース)dst – 変換結果を格納するMatオブジェクト(出力先)code – 変換後の色空間を指定する整数値(カラーコード)カラー画像をグレースケールに変換する場合は、第3パラメータにImgproc.COLOR_RGB2GRAYを指定します。このコードはRGB形式の画像をグレースケール(白黒の濃淡表現)へ変換することを意味しています

  2. JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法

    OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列