Python 如何在多个图像中找到一个模板?

Python 如何在多个图像中找到一个模板?,python,opencv,Python,Opencv,我有一个模板和几个图像。所以问题是要找出这个模板是否在图像中。我写了一些循环,但我认为它不会返回布尔值 for i in images: res = cv2.matchTemplate(i,templateDealer,cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) top_left = max_loc bottom_

我有一个模板和几个图像。所以问题是要找出这个模板是否在图像中。我写了一些循环,但我认为它不会返回布尔值

    for i in images:
        res = cv2.matchTemplate(i,templateDealer,cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
        top_left = max_loc
        bottom_right = (top_left[0] + w, top_left[1] + h)
        cv2.rectangle(i, top_left, bottom_right, (0, 255, 0), 2)
        result.append(res)

请帮助我制作…

matchTemplate
返回一个2D数组,其中包含每个像素位置的匹配值-模板与该位置的匹配程度。
cv2.minMaxLoc(res)
返回图像中最佳匹配的值和位置。当您直观地比较它时,它可能不是实际的匹配,但它是算法返回的最高值。您可以在多个图像上比较此最高值,最高值就是您要查找的图像。
注意:您不应该为此使用规范化算法,请使用
cv2.TM\u cceeff
而不是
cv2.TM\u cceeff\u NORMED

您需要做的是附加一个包含最高值及其位置的元组:
result.append((最大值,最大位置))


处理完所有图像后,找到最高的最大值,并使用它的最大位置绘制一个矩形,minMaxLoc将始终为您提供一些信息

这完全取决于你的任务。我能想到一些可能性

(1) 您正在查找N个图像中最可能出现的情况的1个图像

在本例中,跨一个方向连接所有图像。然后运行标准opencv tempalte matching和minmaxloc以找到最可能的loation

vis = np.concatenate((img1, img2), axis=0) # do it for N image if necessary
(2) 您只需要检查模板与所有N个图像的相似性

然后,您需要在minmax之后声明一个阈值,以查看其中是否有高于阈值的点,如果有返回1,如果没有返回0

def getBestMatch():
images = [
    cv2.imread('tmp/1.png'),
    cv2.imread('tmp/2.png'),
    cv2.imread('tmp/3.png'),
    cv2.imread('tmp/4.png'),
    cv2.imread('tmp/5.png'),
    cv2.imread('tmp/6.png')
]
template = cv2.imread('template.png')

result = []
for i in images:
    match = cv2.matchTemplate(i, template, cv2.TM_CCOEFF_NORMED)
    _, confidence, _, _ = cv2.minMaxLoc(match)
    result.append(confidence)

posNum = result.index(max(result))
return posNum