Ошибка экстрактора расстояния контекста формы opencv

Я использую opencv-python для вычисления расстояния между двумя изображениями. Вот мой код:

import cv2
import numpy as np
# images loaded as grayscale images
im1 = cv2.imread("first.bmp", 0)
im2 = cv2.imread("second.bmp", 0)

# converting to binary images
_, im1 = cv2.threshold(im1, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
_, im2 = cv2.threshold(im2, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

# finding contours!!
_, cntr1, _ = cv2.findContours(im1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
_, cntr2, _ = cv2.findContours(im2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)


# In the next few lines I combine different contours founded in each image 
# because the method that computes the distance needs single contour and 
# would gives an error if given a set of contours
temp = cntr1[0]
for i in range(1, len(cntr1)):
    temp = np.vstack([temp, cntr1[i]])

temp2 = cntr2[0]
for i in range(1, len(cntr2)):
    temp2 = np.vstack([temp2, cntr2[i]])


# creating shape context distance extractor object, using it to compute
# distance and printing result
scde = cv2.createShapeContextDistanceExtractor()
distance = scde.computeDistance(temp, temp2)
print(distance)

Теперь все выглядит хорошо, если два изображения относительно похожи. например, для изображений a и image b расстояние составляет 0,2716, что довольно мало, и поэтому мы можем заключить, что эти изображения имеют одинаковую форму в них. но когда изображения более различны, например, изображение a и изображение c(изображение перевернуто по горизонтали), возникает ошибка:

cv2.error: OpenCV (3.4.2) C: \ projects \ opencv-python \ opencv \ modules \ core \ src \ matmul.cpp: 1218: ошибка: (-215: подтверждение не выполнено) type == (((6) & ((1 << 3) - 1)) + (((2)-1) << 3)) в функции 'cv::gemmImpl'

Что означает эта ошибка? как я могу решить это?

Кстати, код, который комбинирует контуры, не влияет на предоставленные мною изображения, так как для всех них имеется только один контур. Вы можете просто удалить эти строки и использовать distance = scde.computeDistance(cntr1[0],cntr2[0]) в предпоследней * строке.

* какое удивительное слово

0 ответов

Другие вопросы по тегам