Python opencv模式匹配不起作用
我需要找到图像中的所有图像,对于此创意解决方案:Python opencv模式匹配不起作用,python,python-3.x,opencv,image-processing,Python,Python 3.x,Opencv,Image Processing,我需要找到图像中的所有图像,对于此创意解决方案: 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, templ
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)
来源数据:
(来源)
(模板)
我试图使用此代码,但失败了
我现在看到的是:
我期望得到的是:
怎么了?
我正在使用python 3.5和opencv 3.3.0.10
PS:非常有趣的事情,它工作完美,但只找到一个匹配项(最佳匹配项)我绝对不是OpenCV的专家,它的各种模板匹配方法(尽管巧合的是我已经开始使用它)
然而,在您的示例中,有两件事情非常突出
您使用cv2.TM_CCOEFF方法,该方法给出的结果普遍高于0.8阈值。因此,图像中的每一处都匹配出一个巨大的红色矩形斑点。
如果要使用此方法,请尝试cv2.TM_CCOEFF_NORMED将结果归一化到1以下
但我最好的10分钟尝试是使用
method = cv2.TM_CCORR_NORMED
和背景
threshold = 0.512
给予
但这并不令人满意,因为必须对阈值进行相当精确的“调整”,以消除大多数不匹配。毫无疑问,有更好的方法来获得更可靠的突出匹配。调整阈值。此外,OpenCV的模板匹配不考虑alpha通道或掩码,这可能在您的任务中好得多。阈值调整将适用于具体图像,但我有不同类型的图像,需要通用解决方案编码您自己的模板匹配与alpha通道或掩码的支持。谢谢,我会为参与做很多尝试,但我会使用不同的图片,不能为每个图片调整阈值,所以解决方案还没有准备好。还有一件有趣的事情[此解决方案)效果完美,但只能找到一张图像而不是全部图像,请您更改此解决方案以查找所有图像好吗?我的技能太低,这很公平,我没有尝试为您生成完整的解决方案。您问我为什么会得到实心红色图像结果,这就是我的答案试图解释的。我认为此模板方法应该ld仍然可以很好地处理你的图像,但可能需要一些额外的研究来找出如何最好地应用它。