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

如何用OpenCV从图像中获取并绘制多边形近似的顶点?

解决OpenCV多边形近似的边与顶点绘制问题

你只需要在现有代码基础上添加绘制近似多边形边和标记顶点的逻辑即可,以下是修改后的完整代码:

import cv2
import numpy as np

# load image
img = cv2.imread('tinytri.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# apply canny edge detection
edges = cv2.Canny(gray, 60, 160)

# apply morphology close
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
morph = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)

# get contours and keep largest
contours = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1] 
big_contour = max(contours, key=cv2.contourArea)

# 绘制原始轮廓(红色)
contour_img = img.copy()
cv2.drawContours(contour_img, [big_contour], 0, (0,0,255), 1)

# 计算多边形近似
peri = cv2.arcLength(big_contour, True)
approx = cv2.approxPolyDP(big_contour, 0.01 * peri, True)
print('number of sides:', len(approx))

# 1. 绘制近似多边形的边(绿色,线宽2,和原始轮廓区分)
cv2.drawContours(contour_img, [approx], 0, (0,255,0), 2)

# 2. 标记近似多边形的顶点(蓝色实心圆,半径5)
for point in approx:
    # 提取顶点坐标,approx的结构是[[x,y]],所以需要取[0]
    x, y = point[0]
    cv2.circle(contour_img, (x, y), 5, (255,0,0), -1)

# 显示结果图像
cv2.imshow('Polygon Approximation with Vertices', contour_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 可选:保存结果
# cv2.imwrite('polygon_approx_result.png', contour_img)

关键逻辑说明

  • 绘制近似多边形的边:cv2.drawContours可以直接接收approx作为轮廓参数,因为approxPolyDP返回的就是多边形顶点组成的轮廓点集,用不同颜色和线宽可以清晰区分原始轮廓与近似结果。
  • 标记顶点:遍历approx中的每个顶点,由于其格式为三维数组([[[x1,y1]], [[x2,y2]], ...]),需要通过point[0]提取二维坐标,再用cv2.circle绘制实心圆标记,-1参数表示填充圆。

内容的提问来源于stack exchange,提问作者markdoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:18:14