@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)
输入图像:
使用眼睛作为模板:
并查看输出。两只眼睛附近有很多白色像素。你会得到不少高分的答案:
在同一图像中查找模板的多个副本的另一种方法是通过覆盖找到的区域来修改图像,然后再次匹配。但比这更好的是修改结果并重新运行minMaxLoc
。此答案中演示了这两种技术。