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

时间:2019-05-23 17:15:43

标签: 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_right = (top_left[0] + w, top_left[1] + h)
        cv2.rectangle(i, top_left, bottom_right, (0, 255, 0), 2)
        result.append(res)

请帮助我做到这一点...

3 个答案:

答案 0 :(得分:0)

matchTemplate返回带有每个像素位置匹配值的2D数组-模板与该位置的匹配程度。
cv2.minMaxLoc(res)返回图像中最匹配的值和位置。在视觉上进行比较时,它可能不是实际的匹配,但它是算法返回的最大值。您可以在多个图像上比较此最高值,最高的就是您要寻找的图像。
注意:您不应为此使用规范化算法,而应使用cv2.TM_CCOEFF代替cv2.TM_CCOEFF_NORMED

您需要做的是附加一个元组,该元组具有最高的值及其位置:
 result.append((max_val, max_loc))
 处理完所有图像后,找到最高的max_val,并使用max_loc绘制一个矩形

答案 1 :(得分:0)

minMaxLoc总是会给你一些东西。

enter image description here

这完全取决于您的任务。我可以想到的可能性很小

(1)您正在N幅图像中仅寻找最可能情况的1幅图像。

在这种情况下,将所有Image沿一个方向串联。然后运行标准的opencv tempalte匹配和minmaxloc以找到最可能的乳液

vis = np.concatenate((img1, img2), axis=0) # do it for N image if necessary

(2)您只想检查模板与所有N个图像的相似性。

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

答案 2 :(得分: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