如何基于已知x、y坐标绘制带圆角的多边形?
基于坐标点绘制带圆角多边形的实现方案
你当前的代码只能生成直角边的多边形,运行输出的直角多边形效果如下:
你当前的参考代码:
def create_mask(dirct,filename,alistofpoint,height,width): myimg = np.zeros((height,width), dtype = "uint8") po = np.array(alistofpoint, np.int32) myimg_mod=cv2.fillPoly(myimg, [po],(255,255)) cv2.imwrite(dirct+"//"+filename, myimg_mod)
以下提供两种可直接使用的实现方案:
方案1:仅用OpenCV实现(无需额外安装第三方库)
原理是先生成直角填充多边形,再在每个顶点处绘制对应圆角半径的填充圆形,最后可选择性做平滑处理消除边缘锯齿,直接调整radius参数即可控制圆角大小:
import numpy as np import cv2 def create_rounded_mask(dirct, filename, alistofpoint, height, width, radius=10): # 生成空白底图 myimg = np.zeros((height, width), dtype="uint8") po = np.array(alistofpoint, np.int32) # 先填充直角多边形 cv2.fillPoly(myimg, [po], 255) # 在每个顶点处画填充圆形,实现圆角效果 for point in po: cv2.circle(myimg, (point[0], point[1]), radius, 255, -1) # 可选:高斯模糊平滑边缘,消除锯齿 myimg = cv2.GaussianBlur(myimg, (3, 3), 0) # 二值化保证输出是纯黑白掩码 _, myimg = cv2.threshold(myimg, 127, 255, cv2.THRESH_BINARY) cv2.imwrite(f"{dirct}//{filename}", myimg)
方案2:基于Shapely实现(圆角效果更自然,支持复杂多边形)
如果可以安装额外库优先推荐该方案,通过Shapely的几何处理能力直接生成规整的圆角多边形:
- 先安装依赖:
pip install shapely - 代码实现:
import numpy as np import cv2 from shapely.geometry import Polygon def create_rounded_mask(dirct, filename, alistofpoint, height, width, radius=10): myimg = np.zeros((height, width), dtype="uint8") # 生成原始多边形对象 poly = Polygon(alistofpoint) # 生成圆角多边形,join_style设为1对应圆角样式 rounded_poly = poly.buffer(radius, join_style=1).buffer(-radius, join_style=1) # 提取圆角多边形的坐标点 rounded_points = np.array(rounded_poly.exterior.coords, np.int32) # 填充圆角多边形 cv2.fillPoly(myimg, [rounded_points], 255) cv2.imwrite(f"{dirct}//{filename}", myimg)
两种方案都可以直接传入你已有的坐标列表使用,调整radius参数即可得到不同弧度的圆角效果。
内容的提问来源于stack exchange,提问作者Emy Ibrahim
相关产品推荐
相关产品推荐

