轮廓与特征
轮廓面积¶
area = cv2.contourArea(cnt) # 4386.5
注意轮廓特征计算的结果并不等同于像素点的个数,而是根据几何方法算出来的,所以有小数。
轮廓周长¶
perimeter = cv2.arcLength(cnt, True) # 585.7
参数2表示轮廓是否封闭,显然我们的轮廓是封闭的,所以是True。
外接矩形¶
形状的外接矩形有两种,如下图,绿色的叫外接矩形,表示不考虑旋转并且能包含整个轮廓的矩形。蓝色的叫最小外接矩,考虑了旋转:
x, y, w, h = cv2.boundingRect(cnt) # 外接矩形
cv2.rectangle(img_color1, (x, y), (x + w, y + h), (0, 255, 0), 2)
rect = cv2.minAreaRect(cnt) # 最小外接矩形
box = np.int0(cv2.boxPoints(rect)) # 矩形的四个角点取整
cv2.drawContours(img_color1, [box], 0, (255, 0, 0), 2)
其中np.int0(x)是把x取整的操作,比如377.93就会变成377,也可以用x.astype(np.int)。
最小外接圆¶
外接圆跟外接矩形一样,找到一个能包围物体的最小圆:
(x, y), radius = cv2.minEnclosingCircle(cnt)
(x, y, radius) = np.int0((x, y, radius)) # 圆心和半径取整
cv2.circle(img_color2, (x, y), radius, (0, 0, 255), 2)
拟合椭圆¶
我们可以用得到的轮廓拟合出一个椭圆:
ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(img_color2, ellipse, (255, 255, 0), 2)