我有一个模板和几张图像。因此,问题在于找出图像中是否包含此模板。我写了一些循环,但我认为它不返回布尔值...
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)
请帮助我做到这一点...
答案 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总是会给你一些东西。
这完全取决于您的任务。我可以想到的可能性很小
(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