Использование cv.matchTemplate для поиска нескольких лучших совпадений - PullRequest
2 голосов
/ 10 июля 2019

Я использую функцию cv.matchTemplate, чтобы попытаться найти совпадения шаблонов.

result = cv.matchTemplate(img, templ, match_method)

После запуска функции у меня есть куча ответов в списке result.Я хочу отфильтровать список, чтобы найти лучшие n совпадения.Данные в result просто большой массив чисел, поэтому я не знаю, по каким критериям фильтровать.Использование extremes = cv.minMaxLoc(result, None) фильтрует список результатов нежелательным образом перед преобразованием их в местоположения.

Метод match_method равен cv.TM_SQDIFF.Я хочу:

  • отфильтровать результаты до лучших совпадений
  • Использовать результаты, чтобы получить местоположения

Как я могу добиться этого?

1 Ответ

1 голос
/ 11 июля 2019

Вы можете портировать результат matchTemplate, чтобы найти места с достаточным соответствием. Этот урок поможет вам начать. Читайте внизу страницы, чтобы найти несколько совпадений.

import numpy as np

threshold = 0.2
loc = np.where( result <= threshold) # filter the results
for pt in zip(*loc[::-1]): #pt marks the location of the match
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

Имейте в виду, в зависимости от того, какая функция будет использоваться, будет определять способ фильтрации. cv.TM_SQDIFF стремится к нулю при повышении качества соответствия, поэтому установка threshold ближе к нулю отфильтровывает хуже. Обратное верно для cv.TM CCORR cv.TM_CCORR_NORMED cv.TM_COEFF и cv.TM_COEFF_NORMED методов сопоставления (лучше стремится к 1)

...