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

如何基于已知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的几何处理能力直接生成规整的圆角多边形:

  1. 先安装依赖:pip install shapely
  2. 代码实现:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:48:03