Как мне использовать OpenCV MatchTemplate? - PullRequest
9 голосов
/ 15 марта 2012

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

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 ]

11 голосов
/ 15 марта 2012

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

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

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

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

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

7 голосов
/ 19 января 2013

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

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 для полного списка.

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

...