Ну, здесь что-то определенно не так. И это связано с:
cnt1 = contours[0]
# ...
cnt2 = contours[0]
Вы предполагаете, что найдено только два контура. Итак, если вы сделаете:
import numpy as np
#....your code
for c in contours1:
img_test = np.zeros(img_1.shape)
img_test = cv2.drawContours(img_test , [c], -1, (1), thickness=-1)
cv2.namedWindow("c", cv2.WINDOW_GUI_NORMAL)
cv2.imshow("c", img_test )
cv2.waitKey(0)
Вы получите:
Как видите, найдены два контура. Если вы сделаете то же самое для contours2
, вы получите:
Есть также два контура для второго изображения. Итак, в вашем коде вы делаете:
cnt1 = contours[0]
# ...
cnt2 = contours[0]
Итак, вы пытаетесь сопоставить первые контуры на обоих изображениях с тем, что, как вы можете видеть из приведенных выше изображений, являются всего лишь точкой. И поэтому вы получаете значение результата 0
-> Они одинаковы.
Итак, вам нужно помнить, что вы сравниваете правильные контуры. В этом случае вы можете видеть только контуры, которые можно проверить визуально, но у вас может быть несколько контуров, и вам нужно что-то придумать, чтобы отфильтровать их и выбрать, какие из них сравнивать. В этом случае вы знаете, что вы можете сделать:
import cv2
import numpy as np
img_1 = cv2.imread('1.png', 0)
img_2 = cv2.imread('2.png', 0)
ret, thresh = cv2.threshold(img_1, 127, 255, 0)
ret, thresh2 = cv2.threshold(img_2, 127, 255, 0)
contours1, hierarchy = cv2.findContours(thresh, 2, 1)
cnt1 = contours1[1]
contours2, hierarchy = cv2.findContours(thresh2, 2, 1)
cnt2 = contours2[1]
ret = cv2.matchShapes(cnt1, cnt2, 1, 0.0)
print(ret)
В этом случае вы будете сравнивать правильные контуры.
Выходы:
15.69319078874479
Надеюсь, это поможет.