You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:22:52