res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
matchTemplate рассчитывает для каждого пикселя, насколько хорошо шаблон соответствует изображению в этом месте.Возвращает 2d массив с этими значениями.Используемый метод - TM_CCOEFF_NORMED
, значение NORMED означает, что результаты нормализованы, поэтому значения отображаются в диапазоне от 0 до 1. Вы можете отобразить res
, наилучшее совпадение будет белым.Это изображение взято из документов здесь , где вы можете найти дополнительную информацию.
threshhold = 0.70
loc = np.where( res >= threshhold)
np.where
возвращаетиндексы, где значение res
/ качество соответствия больше или равно пороговому значению, которое установлено на 0,70.Индексы соответствуют значениям x и y изображения.Индексы возвращаются как кортеж из двух массивов - один для x, один для y. Хорошие примеры
for pt in zip(*loc[:: -1]):
Здесь происходит несколько отдельных вещей:
*loc[:: -1]
An * допускает произвольное количество аргументов.Он используется для распаковки кортежа loc
. пример
zip(loc[1],loc[0])
делает то же самое, что и zip(*loc[:: -1])
Изменение списка кажется произвольным и не является необходимым, если вы учитываете его в остальной частикод.
for pt in zip()
zip () возвращает итеративный объект, который можно использовать для зацикливания.Он создает кортежи входных аргументов и, используя for pt in
, возвращает их один за другим.В этом случае входные данные представляют собой массив значений x и массив значений y, поэтому он вернет кортеж (x, y).Кортеж хранится в pt
.
Попробуйте отобразить / распечатать некоторые шаги, это поможет вам понять.
===
, если вы хотите толькоодин раз, я полагаю, вы хотите лучший матч.Вы можете использовать следующее:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
max_loc
будет содержать x, y лучшего совпадения.(верхний левый угол)