Contour = đường nối các điểm ranh giới hình dạng. Dùng để: tìm hình dạng, tính diện tích, phát hiện/nhận diện đối tượng.
Tìm contour bằng findContours(). Tính diện tích bằng contourArea() của Imgproc, nhận contour và trả về diện tích.
Ví dụ minh họa
Tìm diện tích mỗi hình trong ảnh, vẽ contour diện tích > 5000 màu đỏ, còn lại màu trắng.
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 {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String file = "D:\\Images\\javafx_graphical.jpg";
Mat src = Imgcodecs.imread(file);
// Chuyển nhị phân
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);
// Tìm contour
List contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(binary, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
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 area = Imgproc.contourArea(contours.get(i));
System.out.println(area);
if (area > 5000.0) {
Imgproc.drawContours(draw, contours, i, color, 2, Imgproc.LINE_8, hierarchy, 2, new Point());
} else {
color = new Scalar(255, 255, 255);
Imgproc.drawContours(draw, contours, i, color, 2, Imgproc.LINE_8, hierarchy, 2, new Point());
}
}
HighGui.imshow("Contour Areas", draw);
HighGui.waitKey();
}
}
Kết quả diện tích
4091.0
6336.0
189.0
6439.0
4903.0
Hình ảnh kết quả
