如何在点顺序未知的情况下绘制填充多边形?
解决无序坐标点的多边形填充问题
问题根源在于你传入的坐标点是无序的,cv2.drawContours需要点按顺时针或逆时针顺序排列才能正确绘制闭合多边形,无序点会导致连线交叉,最终填充出错误的区域。
解决方法:凸包检测
通过凸包检测可以自动将无序点排序,生成能包含所有点的最小凸多边形,完全匹配你想要的填充效果。
修改后的代码
import cv2 import numpy as np # 将点列表转为numpy数组(需为int32类型) all_centre_np = np.array(all_centre, dtype=np.int32) # 计算凸包(自动完成点的有序排列) hull = cv2.convexHull(all_centre_np) # 用凸包点绘制填充多边形 image2 = cv2.drawContours(image2, [hull], -1, color=(255, 255, 255), thickness=cv2.FILLED)
补充说明
如果你的点分布实际是凹多边形(需要填充凹区域),凸包可能不适用,这时可以考虑用Delaunay三角剖分提取外围轮廓,或者通过点集的轮廓拟合获取有序点,但从你的示例图来看,凸包完全可以满足需求。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

