希望的夏天 发表于 2023-12-7 01:11:46

【Python】【OpenCV】凸轮廓和Douglas-Peucker算法

针对遇到的各种复杂形状的主体,大多情况下,我们可以求得一个近似的多边形来简化视觉图像处理,因为多边形是由直线组成的,这样就可以准确的划分区域来便捷后续的操作。
 
cv2.arcLength() Method:
参数:

[*]curve:要计算周长的轮廓,可以是一个矩形、圆形、多边形等封闭曲线。
[*]closed:一个布尔值,表示轮廓是否为封闭曲线。如果 closed=True,则假设轮廓是闭合的;如果 closed=False,则假设轮廓是开放的。
返回值:

[*]retval:给定轮廓的周长或长度。如果轮廓是一个封闭曲线(如圆形、多边形等),则 retval 表示该曲线的周长;如果轮廓是一条开放曲线(如一条直线),则 retval 表示该曲线的长度。
 
cv2.approxPolyDP() Method:
参数:

[*]curve:要逼近的输入轮廓。
[*]epsilon:指定逼近精度的参数,即逼近多边形与原始曲线之间的最大距离。这个参数决定了逼近的精度,值越小表示逼近得越精确。通常情况下,这个值是一个很小的正数。
[*]closed:一个布尔值,表示逼近多边形是否是封闭的。如果 closed=True,则表示输出的逼近多边形是封闭的,即首尾相连形成一个闭合多边形;如果 closed=False,则表示输出的逼近多边形是开放的。
返回值:

[*]approxCurve:表示逼近后的多边形曲线。这是一个新的轮廓,它是对输入轮廓进行多边形逼近后得到的结果。
 
1 import cv2
2 import numpy
3
4 img = cv2.imread('../img/img.png', -1)
5 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
6 contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
7
8 img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
9 for c in contours:
10   # 计算轮廓的总长的百分之一,作为最大差值
11   epsilon = 0.01 * cv2.arcLength(c, True)
12   # 将轮廓近似为一个多边形
13   approx = cv2.approxPolyDP(c, epsilon, True)
14   # 获取轮廓的凸多边形,并且可以完全包含整个轮廓
15   hull = cv2.convexHull(c)
16
17   # cv2.drawContours(img, , -1, (0, 255, 0), 2)
18   cv2.drawContours(img, , -1, (255, 255, 0), 2)
19   cv2.drawContours(img, , -1, (0, 0, 255), 2)
20
21
22 # img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
23 # img = cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
24 cv2.imshow('', img)
25 cv2.waitKey()
26 cv2.destroyAllWindows() 
上述代码中,可以修改 epsilon(ε)参数来获得不同逼近的多边形,当 epsilon(ε)越大,则得到的多边形越简易,越小则越贴近传入的轮廓形状。
 
运行结果:

 

来源:https://www.cnblogs.com/vangoghpeng/p/17880586.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【Python】【OpenCV】凸轮廓和Douglas-Peucker算法