如何在 Python+Opencv 中找到两个轮廓之间的角度

How can I find the angle between two contours in Python+Opencv

我试图找到 this 图像中两个轮廓之间的角度。然而,最右侧轮廓的中心点到处都在抽动。我正在使用此代码:

if len(contours) > 1:
    cnt1 = contours[0]
    cnt2 = contours[1]
    area = cv2.contourArea(cnt1)
    M1 = cv2.moments(cnt1)
    M2 = cv2.moments(cnt2)
    if area > 30:
        cv2.drawContours(frame, contours, -1, (0, 255, 255), 3)
        X1_px = int(M1['m10'] / M1['m00'])
        Y1_px = int(M1['m01'] / M1['m00'])
        X2_px = int(M2['m10'] / M1['m00'])
        Y2_px = int(M2['m01'] / M1['m00'])
        cv2.circle(frame, (X1_px, Y1_px), 3, (0, 0, 255), -1)
        cv2.circle(frame, (X2_px, Y2_px), 3, (0, 0, 255), -1)

        if (X2_px-X1_px) != 0:
            angle = math.atan((Y2_px-Y1_px)/(X2_px-X1_px))
            angle = int(angle * (180 / math.pi))
            print(angle)

我认为我的代码中的 cnt1、cnt2 部分导致了问题,我不知道 openCV 如何对该数组中的轮廓进行排序。

谁能帮我修复这段代码?

我假设你已经根据面积等过滤了轮廓,最后你只剩下 2 个轮廓:

现在对于两个轮廓,只需获取中心点计算角度为:

import cv2
import math


def get_center(contour):
    M = cv2.moments(contour)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])

    return cX, cY


def get_angle(p1, p2):
    return math.atan2(p1[1] - p2[1], p1[0] - p2[0]) * 180/math.pi


img = cv2.imread("./binary_img.png", 0)
i, contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
if len(contours) == 2:
    center_1, center_2 = get_center(contours[0]), get_center(contours[1])
    print get_angle(center_1, center_2)