Java OpenCVライブラリで画像の輪郭面積を検出する方法
輪郭(コンタ)とは
輪郭(Contours)とは、特定の形状の境界線上にあるすべての点を結んだ線のことです。輪郭を利用することで、以下のような処理が可能になります。
- 物体の形状を検出する
- 物体の面積を計算する
- 物体を検出する
- 物体を認識する
画像内のさまざまな形状や物体の輪郭は、findContours() メソッドを使用して検出できます。また、入力画像内の図形の面積を求めることも可能です。その場合は、Imgproc クラスの contourArea() メソッドを呼び出します。このメソッドは特定の形状の輪郭を受け取り、その面積を計算して返します。
サンプルコード
次のJavaの例では、指定した画像内の各図形・物体の面積を求めます。面積が5000より大きい図形は赤色で、それ以外は白色で輪郭線を描画します。
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
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 FindContourArea {
public static void main(String args[]) throws Exception {
// OpenCVのコアライブラリを読み込む
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
// 画像ファイルを読み込む
String file ="D:\\Images\\javafx_graphical.jpg";
Mat src = Imgcodecs.imread(file);
// ソース画像をグレースケールに変換
Mat gray = new Mat(src.rows(), src.cols(), src.type());
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
// グレースケール画像を2値化
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);
// 描画用のMatを作成
Mat draw = Mat.zeros(src.size(), CvType.CV_8UC3);
for (int i = 0; i < contours.size(); i++) {
Scalar color = new Scalar(0, 0, 255);
// 面積を計算
double cont_area = Imgproc.contourArea(contours.get(i));
System.out.println(cont_area);
if(cont_area>5000.0){
// 面積が5000より大きい場合は赤で描画
Imgproc.drawContours(draw, contours, i, color, 2,
Imgproc.LINE_8, hierarchey, 2, new Point() ) ;
} else {
// それ以外は白で描画
color = new Scalar(255, 255, 255);
Imgproc.drawContours(draw, contours, i, color, 2, Imgproc.LINE_8,
hierarchey, 2, new Point() ) ;
}
}
HighGui.imshow("Contours operation", draw);
HighGui.waitKey();
}
}実行結果
4091.0 6336.0 189.0 6439.0 4903.0
上記の出力に加えて、このプログラムを実行すると以下のようなウィンドウが表示されます。

処理の流れのポイント
このプログラムでは、まず cvtColor() メソッドでカラー画像をグレースケールに変換し、続いて threshold() メソッドで2値化処理を行っています。輪郭検出は2値画像に対して行うのが基本となるため、この前処理が重要です。
検出された各輪郭に対して contourArea() を呼び出すことで面積が取得でき、その値に応じて描画色を切り替えることで、サイズの大きい物体と小さい物体を視覚的に区別できます。
-
JavaのOpenCVライブラリでカラー画像をグレースケールに変換する方法
カラー画像をグレースケールに変換する基本OpenCVのImgprocクラスが提供するcvtColor()メソッドを使うと、画像の色空間を別の色空間へ変換できます。このメソッドは以下の3つのパラメータを受け取ります。src – 変換元の画像を表すMatオブジェクト(ソース)dst – 変換結果を格納するMatオブジェクト(出力先)code – 変換後の色空間を指定する整数値(カラーコード)カラー画像をグレースケールに変換する場合は、第3パラメータにImgproc.COLOR_RGB2GRAYを指定します。このコードはRGB形式の画像をグレースケール(白黒の濃淡表現)へ変換することを意味しています
-
JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法
OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列