Как использовать OpenCV MatchTemplate?

Я пытаюсь найти изображение в другом.

im = cv.LoadImage('1.png', cv.CV_LOAD_IMAGE_UNCHANGED)
    tmp = cv.LoadImage('e1.png', cv.CV_LOAD_IMAGE_UNCHANGED)
    w,h = cv.GetSize(im)
    W,H = cv.GetSize(tmp)
    width = w-W+1
    height = h-H+1
    result = cv.CreateImage((width, height), 32, 1)
    cv.MatchTemplate(im, tmp, result, cv.CV_TM_SQDIFF)
    print result

когда я запускаю это, все выполняется просто отлично, никаких ошибок не выбрасывается. Но я не знаю, что делать дальше. Доктор говорит, что result хранит "карту результатов сравнения". Я попытался распечатать его, но он дает мне ширину, высоту и шаг.

Как использовать эту информацию, чтобы узнать, находится ли одно изображение в другом / где оно находится?

2 ответов


MatchTemplate возвращает карту сходства, а не местоположение. Затем вы можете использовать эту карту, чтобы найти место.

если вы ищете только один матч, вы можете сделать что-то вроде этого, чтобы получить местоположение:

minVal,maxVal,minLoc,maxLoc = cv.MinMaxLoc(result)

затем minLoc имеет расположение лучшего матча и minVal описывает, насколько хорошо подходит шаблон. Вам нужно придумать порог minVal чтобы определить, считаете ли вы этот результат в матче или нет.

если вы ищете для более чем одного соответствия на изображение вам нужно использовать алгоритмы, такие как не максимальное подавление.


Это может сработать для вас! :)

def FindSubImage(im1, im2):
    needle = cv2.imread(im1)
    haystack = cv2.imread(im2)

    result = cv2.matchTemplate(needle,haystack,cv2.TM_CCOEFF_NORMED)
    y,x = np.unravel_index(result.argmax(), result.shape)
    return x,y

CCOEFF_NORMED является лишь одним из множества методы сравнения. Смотрите: http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html полный список.

не уверен, что это лучший метод, но быстро, и работает просто отлично для меня! :)