如何在OpenCV中绘制填充形状?点列表绘图无效果问题排查
为什么OpenCV的fillPoly无法填充我的自定义多边形?
问题描述
我拥有一个点列表,想要基于这些点绘制填充形状。我尝试了如下代码:
List<Point> points = new ArrayList<>(); points.add(new Point(0, 0)); points.add(new Point(100, 0)); points.add(new Point(100, 100)); points.add(new Point(0, 100)); points.add(new Point(50, 50)); Imgproc.polylines(imgMAT, matOfPoints, true, new Scalar(255, 0, 0), 8);我也使用了
Imgproc.fillPoly(imgMAT, matOfPoints, new Scalar(255, 0, 0));但没有任何变化,请问问题出在哪里?
问题根源与修复方案
我帮你排查了下,主要有两个坑导致fillPoly没生效:
1. 自相交的多边形顶点序列
你最后加的Point(50,50)把原本的正方形变成了自相交的复杂多边形——想象一下,从正方形的最后一个点(0,100)直接连到中心(50,50),再闭合回起点(0,0),这会让多边形的填充区域相互抵消,看起来就像没填充一样。
如果只是想填充正方形,只需要保留前四个按顺序排列的顶点就行:
List<Point> points = new ArrayList<>(); points.add(new Point(0, 0)); points.add(new Point(100, 0)); points.add(new Point(100, 100)); points.add(new Point(0, 100));
2. MatOfPoint的构造与参数传递问题
首先要确保你正确把List<Point>转换成MatOfPoint了,不然OpenCV拿不到点数据:
MatOfPoint matOfPoints = new MatOfPoint(); matOfPoints.fromList(points);
另外,fillPoly的第二个参数要求是List<MatOfPoint>(支持同时填充多个多边形),如果你直接传单个MatOfPoint会报错或者无效果,得用Collections.singletonList()包装一下:
Imgproc.fillPoly(imgMAT, Collections.singletonList(matOfPoints), new Scalar(255, 0, 0));
修复后的完整可运行代码
// 创建一个200x200的黑色背景彩色图像 Mat imgMAT = Mat.zeros(200, 200, CvType.CV_8UC3); List<Point> points = new ArrayList<>(); points.add(new Point(0, 0)); points.add(new Point(100, 0)); points.add(new Point(100, 100)); points.add(new Point(0, 100)); // 转换点列表为OpenCV格式 MatOfPoint matOfPoints = new MatOfPoint(); matOfPoints.fromList(points); // 填充红色多边形 Imgproc.fillPoly(imgMAT, Collections.singletonList(matOfPoints), new Scalar(255, 0, 0)); // 可选:绘制绿色边框 Imgproc.polylines(imgMAT, Collections.singletonList(matOfPoints), true, new Scalar(0, 255, 0), 2);
额外提示:如果需要带孔洞的填充
要是你本来想做一个带中心孔洞的正方形,那需要定义两个独立的多边形:外部正方形(顺时针顶点)和内部孔洞(逆时针顶点),然后把两个MatOfPoint都放到列表里传给fillPoly,OpenCV会自动处理孔洞的填充逻辑。
内容的提问来源于stack exchange,提问作者Ata
相关产品推荐
相关产品推荐

