Как использовать cv2.minMaxLoc() при сопоставлении с шаблоном

Вот код, который я использовал для сопоставления с шаблоном, и что означают min_val, max_val, min_loc, max_loc? для чего они используются?

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('C:\\machineLearning\\positive\\1.jpg', 0)
img2 = img.copy()
template = cv2.imread('C:\\machineLearning\\positive\\1_.jpg', 0)
w, h = template.shape[::-1]

img = img2.copy()
method = eval('cv2.TM_SQDIFF')

res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

top_left = min_loc
bottom_right = (top_left[0] + w, top_left[1] + h)

cv2.rectangle(img,top_left, bottom_right, 255, 2)

plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img,cmap = 'gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle('cv2.TM_SQDIFF')

plt.show()

person Cherry    schedule 14.11.2018    source источник
comment
min_val == минимальное значение, max_val == максимальное значение, min_loc == местоположение минимального значения (координаты из входного изображения) max_loc == местоположение максимального значения (координаты из входного изображения) Вы можете подтвердить это, выполнив help(cv2.minMaxLoc) в вашем интерпретаторе Python. В приведенном вами примере кода min_loc используется для установки верхнего угла ограничивающей рамки интересующей области. Остальные переменные, похоже, не использовались.   -  person John_Sharp1318    schedule 14.11.2018
comment
min_val = минимальное значение, я точно знаю, что, поскольку я знаю английский, то, что я спросил, было значением минимального значения   -  person Cherry    schedule 14.11.2018
comment
Как написано в документации (docs.opencv.org/master/ d2/de8/) минимальное значение является глобальным минимальным значением (он же минимальное значение среди всех значений матрицы).   -  person John_Sharp1318    schedule 15.11.2018
comment
Это что-то значит? например, если я использую TM_SQDIFF, указывает ли минимальное значение количество совпадений?   -  person Cherry    schedule 15.11.2018
comment
Ознакомьтесь с документацией по функции matchTemplate. Если (и только если) переменная res действительно содержит результаты квадратной разницы (и только это), так что да, минимальное значение будет глобальной минимальной квадратной разницей. Если переменная содержит что-то, на что влияет разность квадратов, но не является разностью квадратов, тогда интерпретация связана с тем, какая информация хранится в res. Вы можете легко найти эту информацию в документации. Пожалуйста, проверьте документацию.   -  person John_Sharp1318    schedule 15.11.2018


Ответы (1)


Если вы просматриваете cv2.matchTemplate() документы, Функция возвращает нечеткую одноканальную матрицу с совпадающей оценкой шаблона и входных сегментов изображения. Для метода cv2.TM_CCOEFF точка с наивысшим баллом будет самой яркой, но в случае метода cv2.TM_SQDIFF_NORMED точка с наивысшим баллом будет самой темной.

cv2.TM_CCOEFF Результаты:

cv2.TM_CCOEFF

cv2.TM_SQDIFF_NORMED Результаты:

введите здесь описание изображения

Таким образом, в зависимости от различных доступных методов, вам иногда может понадобиться получить самое яркое или самое темное пятно в выходной матрице. cv2.minMaxLoc() — это просто объединение этих двух общих операций, когда вы используете minMaxLoc, вы можете игнорировать атрибуты min для своего варианта использования.

person ZdaR    schedule 14.11.2018
comment
Спасибо, так как я использую метод TM_SQDIFF, и мне нужно будет правильно учитывать минимальные атрибуты? что означает самая темная точка? это лучший матч? а если их станет меньше, то обнаружение будет более точным? и если оно становится больше, обнаружение становится более неточным? - person Cherry; 14.11.2018
comment
Да точно :) (у) - person ZdaR; 14.11.2018