#python #opencv #computer-vision
#python #opencv #компьютерное зрение
Вопрос:
Я пытаюсь выполнить сопоставление шаблонов с использованием представления пирамиды, но получаю плохие результаты. Я не уверен, связаны ли плохие результаты с проблемой с моим алгоритмом / кодом или потому, что это просто результат.
Далее следует код, но я в основном взял изображение, преобразовал его в оттенки серого, обрезал изображение, чтобы получить шаблон, масштабировал шаблон, реализовал метод скользящего окна для сопоставления каждого из изображений пирамиды (масштабированного изображения) с изображением запроса, используя показатели корреляции нулевого среднего, SSD и NCC, и определил ошибку локализации
# Load the images
image1 = cv2.imread("image1.jpg")
# Convert the images to grayscale
gray_image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
# Crop the image
y_1 = 100
x_1 = 100
w_1 = 15
h_1 = 15
template_image1 = gray_image1[y_1:y_1 h_1, x_1:x_1 w_1].copy()
# Scale the template image
template_image1_5 = cv2.resize(template_image1, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
template_image1_1 = cv2.resize(template_image1, None, fx=1.0, fy=1.0, interpolation=cv2.INTER_CUBIC)
template_image1_2 = cv2.resize(template_image1, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_CUBIC)
# Store the scaled template and their associated scaling factors in a dictionary
scaled_templates_image1 = {'0.5': template_image1_5, '1.0': template_image1_1, '2.0': template_image1_2}
# Put the three different methods (Zero-mean correlation, SSD, and NCC) in a list
methods = ['cv2.TM_CCORR', 'cv2.TM_SQDIFF', 'cv2.TM_CCORR_NORMED']
for meth in methods:
method = eval(meth)
# Apply template matching
for scale, scaled_template_image1 in scaled_templates_image1.items():
gray_image1_copy = gray_image1.copy()
result = cv2.matchTemplate(gray_image1_copy, scaled_template_image1, method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# If the method is TM_SQDIFF, then take the minimum
if method in [cv2.TM_SQDIFF]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] w_3, top_left[1] h_3)
cv2.rectangle(gray_image1_copy, top_left, bottom_right, 255, 2)
print(meth, top_left, bottom_right)
euclidean_distance = np.linalg.norm(np.subtract((x_1, y_1), top_left))
print("The localization error for the " scale " scale using " meth " method is: "
np.str(euclidean_distance))
plt.subplot(121), plt.imshow(result, cmap='gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(gray_image1_copy, cmap='gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle("The " scale " scale using " meth " method")
plt.show()
Ошибки локализации повсюду. Без масштабирования ошибки локализации для SSD и NCC равны 0.0, в то время как ошибка локализации для корреляции с нулевым средним выше 100 (ожидаемая). При применении масштабирования почти все ошибки локализации превышают 100. Я ошибаюсь или мне просто следует ожидать таких результатов? Возможно, я неправильно понимаю концепцию и / или проблему. Приветствуется любая помощь.
Комментарии:
1. Вы смотрели на шаблон и изображение в каждом из масштабов, чтобы увидеть, имеют ли они смысл?
2. Да, и изображение шаблона в каждом из масштабов выглядит как смесь желтых, синих и зеленых пикселей. У меня такое чувство, что я что-то делаю не так. Все еще работаю над этим…