轮廓 凸轮廓 近似多边形轮廓

凸形状内部的任意两点的连线都在该形状里。

import cv2
import numpy as np

img = cv2.pyrDown(cv2.imread("hammer.jpg", cv2.IMREAD_UNCHANGED))

ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(),
                           cv2.COLOR_BGR2GRAY) , 127, 255, cv2.THRESH_BINARY)  #阈值分割
black = cv2.cvtColor(np.zeros((img.shape[1], img.shape[0]), dtype=np.uint8),
                     cv2.COLOR_GRAY2BGR)

image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL,
                                         cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
  epsilon = 0.01 * cv2.arcLength(cnt,True)       #计算轮廓周长
  approx = cv2.approxPolyDP(cnt,epsilon,True)     #计算近似的多边形框
  hull = cv2.convexHull(cnt)                     #获取轮廓信息
  cv2.drawContours(black, [cnt], -1, (0, 255, 0), 2)   #轮廓  绿色
  cv2.drawContours(black, [approx], -1, (255, 0, 0), 2)  #近似多边形轮廓  蓝色
  cv2.drawContours(black, [hull], -1, (0, 0, 255), 2)   # 凸轮廓  红色

cv2.imshow("hull", black)
cv2.waitKey()
cv2.destroyAllWindows()

轮廓 凸轮廓 近似多边形轮廓