Chapter 8 Contour / Shape Detection

def getContours(img):
    contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    for cnt in contours:
        area = cv2.contourArea(cnt)
        print(area)
        if area > 500:
            # -1 代表所有的轮廓
            cv2.drawContours(imgContours, cnt, -1, (255, 0, 0), 3)
            # 找到轮廓的长度
            peri = cv2.arcLength(cnt, True)
            print(peri)
            # 会给出corner的坐标,polygonal是多边形
            approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
            # 3就是三角形、4是矩形,超过4就是圆形了
            print(len(approx))
            objCor = len(approx)
            # 置信框
            x,y,w,h = cv2.boundingRect(approx)
            if objCor == 3:
                ObjectType = "Tri"
            elif objCor == 4:
                aspRatio = w / float(h)
                if aspRatio > 0.95 and aspRatio < 1.1:
                    ObjectType = "Square"
                else:
                    ObjectType = "Rectangle"
            elif objCor >= 4:
                ObjectType = "Circle"
            else:
                ObjectType = "None"
            # 对角线,经常使用绿色的置信框,知道中心点
            cv2.rectangle(imgContours, (x, y), (x + w, y + h), (0, 255, 0), 2)
            cv2.putText(imgContours, ObjectType, (x + (w//2)-10, y + (h//2)-10),
                        cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0),  2)

img = cv2.imread('images/shapes.png')
imgContours = img.copy()

imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 0)
imgCanny = cv2.Canny(imgBlur, 50, 50)
# 通过检测出来的边缘就可以去找轮廓的特征了
getContours(imgCanny)

imgBlank = np.zeros_like(img)
imgStack = stackImages(0.8, ([img, imgGray, imgBlur],[imgCanny, imgContours, imgBlank]))
cv2.imshow('stack', imgStack)

image

 

posted @ 2025-09-21 21:03  SpongeBob~  阅读(8)  评论(0)    收藏  举报