JavaとOpenCVでポリゴン(凸多角形)を描画する方法をわかりやすく解説
すべての内角が180度未満であるポリゴン(多角形)は「凸多角形」と呼ばれます。Java版OpenCVライブラリのorg.opencv.imgprocパッケージにはImgprocクラスが用意されており、このクラスのfillConvexPoly()メソッドを呼び出すことで、凸多角形を簡単に描画できます。
なお、凹みのある多角形(凹多角形)を描きたい場合は、代わりにfillPoly()メソッドを使用してください。fillConvexPoly()は凸多角形専用の高速な描画メソッドです。
fillConvexPoly()メソッドのパラメータ
fillConvexPoly()メソッドは、以下の3つの引数を受け取ります。
Matオブジェクト:ポリゴンを描画する対象となる画像
MatOfPointオブジェクト:ポリゴンの頂点となる座標点の集合
Scalarオブジェクト:ポリゴンの塗りつぶし色(BGR形式)
サンプルコード
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 DrawingConvexPolygon {
public static void main(String args[]) {
// OpenCVのコアライブラリを読み込む
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 元画像をMatオブジェクトとして読み込む
Mat src = Imgcodecs.imread("D:\\images\\blank.jpg");
// ポリゴンの頂点座標を定義する
MatOfPoint points = new MatOfPoint(
new Point(108, 71), new Point(232, 52),
new Point(321, 161), new Point(269, 250),
new Point(126, 232), new Point(108, 71)
);
// 塗りつぶし色を指定する(BGR値:64, 64, 64 のダークグレー)
Scalar color = new Scalar(64, 64, 64);
// 凸多角形を塗りつぶして描画する
Imgproc.fillConvexPoly(src, points, color);
// 結果画像を保存してウィンドウに表示する
Imgcodecs.imwrite("convex_polygon.jpg", src);
HighGui.imshow("Drawing a polygon", src);
HighGui.waitKey();
}
}
実行結果
上記のプログラムをコンパイルして実行すると、読み込んだ画像の上に指定した6つの頂点を結ぶ凸多角形がダークグレーで塗りつぶされ、次のようなウィンドウが表示されます。同時に、カレントディレクトリにconvex_polygon.jpgというファイル名で結果画像が保存されます。

ポイントまとめ
頂点は
Pointオブジェクトの配列として定義し、MatOfPointに渡します。色はBGR順で指定するため、赤くしたい場合は
new Scalar(0, 0, 255)のようにします。最後の頂点を最初の頂点と同じ座標にすると、図形が確実に閉じられます。
-
JavaとOpenCVのflip()メソッドで画像を反転させる方法
JavaでOpenCVを使用して画像を反転(フリップ)させたい場合、Coreクラスが提供するflip()メソッドを利用します。このメソッドは、画像をX軸・Y軸に沿って反転させることができ、以下の3つの引数を受け取ります。src:元画像のデータを格納したソース行列(Matオブジェクト)dst:処理結果を格納するための空の行列(Matオブジェクト)flipCode:反転の方向を指定するコード(0=X軸方向の反転、正の値=Y軸方向の反転、負の値=両軸方向の反転)画像を反転させる手順OpenCVで画像を反転させるには、次の手順に従います。loadLibrary()メソッドを使用して、OpenCVのコア
-
JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法
OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列