Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Vẽ elip bao quanh đối tượng trong OpenCV Java

Phương thức fitEllipse() của org.opencv.imgproc.Imgproc nhận MatOfPoint2f, tính elip phù hợp và trả về RotatedRect.

Để vẽ elip quanh các đối tượng có thể:

  1. Đọc ảnh bằng imread().
  2. Chuyển xám bằng cvtColor().
  3. Chuyển nhị phân bằng threshold().
  4. Tìm contour bằng findContours().
  5. Lấy RotatedRect cho các contour hợp lệ (>5 điểm) bằng fitEllipse().
  6. Vẽ elip bằng ellipse().

Lưu ý: Cần ít nhất 5 điểm để fit elip.

Ví dụ minh họa

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.MatOfPoint2f;
import org.opencv.core.RotatedRect;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class FitEllipseExample {
    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);
        
        RotatedRect[] rec = new RotatedRect[contours.size()];
        for (int i = 0; i < contours.size(); i++) {
            rec[i] = new RotatedRect();
            if (contours.get(i).rows() > 5) {
                rec[i] = Imgproc.fitEllipse(new MatOfPoint2f(contours.get(i).toArray()));
            }
            Scalar color = new Scalar(190, 0, 0);
            Imgproc.ellipse(src, rec[i], color, 5);
        }
        
        HighGui.imshow("Fit Ellipse", src);
        HighGui.waitKey();
    }
}

Hình ảnh đầu vào và kết quả

Input: Vẽ elip bao quanh đối tượng trong OpenCV Java

Output: Vẽ elip bao quanh đối tượng trong OpenCV Java