其他分享
首页 > 其他分享> > 12. 形态学--轮廓、多边形逼近与凸包

12. 形态学--轮廓、多边形逼近与凸包

作者:互联网

1. 轮廓

findContours(image, mode, method[, contours[, hierarchy[, offset]]])

img = cv2.imread('./contors1.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 注意contours是一个list,里面的元素是ndarray,每个ndarray表示一个contour
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 注意,会直接在原图上进行操作,如果要原图保持不变,就需要copy一份
img_copy = img.copy()
cv2.drawContours(img_copy, contours, 1, (0,0,255), 2)

# 计算轮廓面积
area = cv2.contourArea(contours[1])

# 计算轮廓周长
cv2.arcLength(contours[1], closed=True)

# 返回结果是一个Rotated Rect 旋转的矩形,矩形的起始坐标(x, y), 矩形的长宽,矩形的旋转角度
# boundingRect(points) 最大外接矩阵
rect = cv2.minAreaRect(contours[1])

# cv的工具,将旋转矩阵的四个坐标点计算出来
# 注意:这个计算出来后的数据是float,而在绘图的时候,要求像素点位置,是int的
box = cv2.boxPoints(rect)
# 对boxPoints的结果进行处理
box = np.round(box).astype('int64')
cv2.drawContours(img, [box], 0, (255,0,0), 2)
cv2.imshow('img', img)

2. 多边形逼近与凸包

findContours后的轮廓信息contours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似,这就是轮廓的多边形逼近;
DP算法原理核心,不断找多边形最远的点加入形成新的多边形,直到最短距离小于指定的精度;
approxPolyDP(curve, epsilon, closed, approxCurve=None)

标签:12,多边形,img,--,cv2,凸包,RETR,contours,轮廓
来源: https://www.cnblogs.com/TheoryDance/p/16414334.html