具有多个匹配的opencv python MatchTemplate函数

use*_*488 5 python opencv

我试图在大图中找到小图片并使用MatchTemplate()

img = cv2.imread("c:\picture.jpg")
template = cv2.imread("c:\template.jpg")

result = cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
y,x = np.unravel_index(result.argmax(), result.shape)
Run Code Online (Sandbox Code Playgroud)

工作正常我总是得到左上角的坐标,但这只是一点.如果我在大局上有多场比赛,我怎么能得到所有这些?

b_m*_*b_m 7

这是如何做:

result = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)

#the get the best match fast use this:
(min_x, max_y, minloc, maxloc) = cv2.minMaxLoc(result)
(x,y) = minloc

#get all the matches:
result2 = np.reshape(result, result.shape[0]*result.shape[1])
sort = np.argsort(result2)
(y1, x1) = np.unravel_index(sort[0], result.shape) # best match
(y2, x2) = np.unravel_index(sort[1], result.shape) # second best match
Run Code Online (Sandbox Code Playgroud)

这是最快的方式,因为上面对所有比赛进行了分类,即使是完全错误的比赛.如果性能对您很重要,您可以使用瓶颈的partort功能.


bfr*_*ris 7

@b_m 的答案会起作用,但它会找到太多匹配项。匹配过程将模板滑过图像,在每个像素上进行比较。(或者几乎每个像素。扫描区域会根据模板的大小而减小)。这意味着在良好匹配的附近,您会得到许多其他匹配,但相差一个像素。如果您制作匹配结果的图像,您可以看到您获得了很多匹配项。

import cv2
import numpy as np

image = cv2.imread('smiley.png', cv2.IMREAD_COLOR )
template = cv2.imread('template.png', cv2.IMREAD_COLOR)

h, w = template.shape[:2]

method = cv2.TM_CCOEFF_NORMED

threshold = 0.95

res = cv2.matchTemplate(image, template, method)
# min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

cv2.imwrite('output.png', 255*res)
Run Code Online (Sandbox Code Playgroud)

输入图像:

在此输入图像描述

使用眼睛作为模板:

在此输入图像描述

并查看输出。双眼附近有很多白色像素。你会得到很多高分答案:

在此输入图像描述

在同一图像中查找模板的多个副本的另一种方法是通过覆盖找到的区域来修改图像,然后再次匹配。但比这更好的是修改结果并重新运行minMaxLoc此答案中演示了这两种技术。