如何使用 OpenCV Java 在图像中可能的对象周围绘制椭圆?
javaobject oriented programmingprogramming更新于 2025/10/9 5:32:17
您可以使用 org.opencv.imgproc.Imgproc 类的 fitEllipse() 方法在形状上绘制椭圆。此方法接受 MatOfPoint2f 类的对象,计算适合给定点集的椭圆并返回 RotatedRect 对象。
使用此方法,您可以在图像中可能的对象周围绘制椭圆。为此,
使用 Imgproc 类的 imread() 方法读取图像。
使用 Imgproc 类的 cvtColor() 方法将其转换为灰度图像。
使用 Imgproc 类的 threshold() 方法将灰度图像转换为二进制图像。
使用 Imgproc 类的 findContours() 方法查找图像中的轮廓。
现在,获取可能轮廓的 RotatedRec 对象,将每个轮廓值作为 MatOfPoint2f 绕过到 fitEllipse()方法。
最后,使用 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 {
//加载 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);
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);
//空矩形
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();
}
}
输入图片
输出

相关文章
有用资源
java 参考教程 - 该教程包含有关 java 的更多信息:https://www.cainiaomax.com/java/

