我需要找到图像中的所有图像,这个想法I have found great解决方案:
import cv2
import numpy as np
img_rgb = cv2.imread('source.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('block.png', 0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF)
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
# cv2.imwrite('res.png', img_rgb)
cv2.imshow('output', img_rgb)
cv2.waitKey(0)
来源数据:
https://i.stack.imgur.com/cE5bM.png(来源)
https://i.stack.imgur.com/BgzAA.png(模板)
我尝试使用此代码但失败了。
怎么了? 我使用的是python 3.5和opencv 3.3.0.10
PS:非常有趣的事情another solution完美但只找到1个匹配(最好的一个)
答案 0 :(得分:1)
我肯定没有关于OpenCV的专家和它的各种模板匹配方法(虽然我巧妙地开始玩它)。
然而,你的例子中的一些事情很突出。
您使用cv2.TM_CCOEFF方法,该方法提供的通用方式高于0.8阈值。所以图像中的每个地方都匹配给出一个巨大的红色矩形斑点。 如果要使用此方法,请尝试使用cv2.TM_CCOEFF_NORMED将结果标准化为1以下。
但我最好的10分钟尝试使用;
method = cv2.TM_CCORR_NORMED
并设置
threshold = 0.512
给了;
这是相当令人不满意的,因为必须相当精确地“调整”阈值以消除大部分不匹配。毫无疑问,有更好的方法可以获得更可靠的脱颖而出的比赛。