opencv多边形逼近轮廓python
时间: 2025-03-05 19:38:26 浏览: 42
使用 Python 和 OpenCV 进行多边形逼近轮廓
为了实现多边形逼近轮廓,可以利用 cv2.approxPolyDP
函数来近似表示轮廓。该函数通过减少曲线上的点数量从而简化形状,这有助于提取特定类型的几何图形。
下面是一个完整的例子,展示如何读取图像、转换为灰度图并应用二值化处理,接着找到轮廓并对这些轮廓执行多边形逼近:
import cv2
import numpy as np
def draw_contour(image, contour, approx):
"""绘制原始轮廓及其对应的多边形逼近"""
# 将轮廓和其逼近分别画出来以便对比查看效果
cv2.drawContours(image, [contour], -1, (0, 255, 0), 2)
cv2.drawContours(image, [approx], -1, (0, 0, 255), 2)
# 加载测试图片
img = cv2.imread('shapes.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用阈值操作获取二值图像
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
# 查找所有外部轮廓
contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[^3]
for cnt in contours:
epsilon = 0.02 * cv2.arcLength(cnt, True) # 计算轮廓周长作为精度参数
approx = cv2.approxPolyDP(cnt, epsilon, True) # 获取多边形逼近
if len(approx) >= 3 and len(approx) <= 6: # 只显示三到六边形的结果
draw_contour(img, cnt, approx)
cv2.imshow("Approximated Polygons", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
此脚本会遍历每一个检测到的轮廓,并尝试将其转化为具有较少顶点的新多边形。如果新形成的多边形满足给定条件(即拥有三个至六个角),则会在原图上标记出这两个版本——绿色线条代表实际轮廓而红色线条则是经过逼近后的结果[^1]。
参数解释:
- epsilon: 控制着逼近程度的关键因素之一;越小意味着更接近真实的轮廓形态。
- closed_flag: 表明所得到的多边形是否封闭,在大多数情况下应设为True。
阅读全文