Как использовать 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
полный список.
не уверен, что это лучший метод, но быстро, и работает просто отлично для меня! :)