opencv模式匹配不起作用

时间:2017-10-14 05:50:15

标签: python python-3.x opencv image-processing

我需要找到图像中的所有图像,这个想法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(模板)

我尝试使用此代码但失败了。

我现在看到的: enter image description here

我期望得到的结果: enter image description here

怎么了? 我使用的是python 3.5和opencv 3.3.0.10

PS:非常有趣的事情another solution完美但只找到1个匹配(最好的一个)

1 个答案:

答案 0 :(得分:1)

肯定没有关于OpenCV的专家和它的各种模板匹配方法(虽然我巧妙地开始玩它)。

然而,你的例子中的一些事情很突出。

您使用cv2.TM_CCOEFF方法,该方法提供的通用方式高于0.8阈值。所以图像中的每个地方都匹配给出一个巨大的红色矩形斑点。 如果要使用此方法,请尝试使用cv2.TM_CCOEFF_NORMED将结果标准化为1以下。

但我最好的10分钟尝试使用;

method = cv2.TM_CCORR_NORMED

并设置

threshold = 0.512

给了;

enter image description here

这是相当令人不满意的,因为必须相当精确地“调整”阈值以消除大部分不匹配。毫无疑问,有更好的方法可以获得更可靠的脱颖而出的比赛。