如何使用 OpenCV Java 在图像中可能的物体周围拟合椭圆?
您可以使用 org.opencv.imgproc.Imgproc 类的 fitEllipse() 方法在形状上拟合椭圆。此方法接受一个 MatOfPoint2f 类的对象,计算适合给定点集的椭圆,并返回一个 RotatedRect 对象。
使用它,您可以围绕图像中可能的物体绘制椭圆。为此,
使用 Imgproc 类的 imread() 方法读取图像。
使用 Imgproc 类的 cvtColor() 方法将其转换为灰度图像。
使用 Imgproc 类的 threshold() 方法将灰度图像转换为二值图像。
使用 Imgproc 类的 findContours() 方法查找图像中的轮廓。
现在,通过将每个轮廓值作为 MatOfPoint2f 传递给 fitEllipse() 方法,获取可能的轮廓的 RotatedRect 对象。
最后,使用 ellipse() 方法围绕可能的形状绘制椭圆。
注意 - 要拟合椭圆,对象应至少包含五个点。
示例
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 { //Loading the OpenCV core library System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); //Reading the contents of the image String file ="D:\Images\javafx_graphical.jpg"; Mat src = Imgcodecs.imread(file); //Converting the source image to binary 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); //Finding Contours List<MatOfPoint> contours = new ArrayList<>(); Mat hierarchey = new Mat(); Imgproc.findContours(binary, contours, hierarchey, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE); //Empty rectangle 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_elli = new Scalar(190, 0, 0); Imgproc.ellipse(src, rec[i], color_elli, 5); } HighGui.imshow("Contours operation", src); HighGui.waitKey(); } }
输入图像
输出
广告