首页 > 解决方案 > OpenCV matchTemplate 多次找到相同的 shapen - Python

问题描述

我的问题是我在这里提出的问题的延伸。

我正在使用 matchTemplate 在页面上查找圆圈。这是结果:

在此处输入图像描述

我想找到这些矩形中点的位置,我可以用矩形角的坐标来做。我在四个循环中放了一个列表,因此代码可以捕获矩形的坐标。这是结果:

[..., 
 [(144, 187), (539, 571)],
 [(145, 187), (540, 571)],
 [(146, 187), (541, 571)],
 [(147, 187), (542, 571)],
 [(148, 187), (543, 571)],
 [(149, 187), (544, 571)],
 [(150, 187), (545, 571)],
 [(151, 187), (546, 571)],
 [(152, 187), (547, 571)],
 [(133, 188), (528, 572)],
 [(134, 188), (529, 572)],
 [(135, 188), (530, 572)],
 [(136, 188), (531, 572)],
 [(137, 188), (532, 572)],
 [(138, 188), (533, 572)],
 [(139, 188), (534, 572)],
 [(140, 188), (535, 572)],
 [(141, 188), (536, 572)],
 [(142, 188), (537, 572)],
 [(143, 188), (538, 572)],
 [(144, 188), (539, 572)],
 [(145, 188), (540, 572)],
 [(146, 188), (541, 572)],
 [(147, 188), (542, 572)],
 [(148, 188), (543, 572)],
 [(149, 188), (544, 572)],
 ...]

这只是一个片段:有数百行这样的行给了我 matchTemplate 一遍又一遍地找到同一个圆圈的信息。我期望只有五组角值。

首先,我开始删除列表中的所有双精度值,但由于在那之后还有很多值,所以我仍然遇到同样的问题。

有没有人有办法为每个圆找到一组角值(这肯定是正确的),以便我可以使用该值?

我希望我的问题很清楚,有人可以提供帮助。

问候, Ganesh


编辑:我的问题还不清楚,所以我希望这个编辑能让你更清楚。

首先,我希望我的代码能够使用 OpenCV 匹配模板找到图像上的圆圈。我在这里有代码、图像和模板:

import cv2
import numpy as np

#load image into variable
img_rgb = cv2.imread('example_scan.jpg')

#load template
template = cv2.imread('example_template.jpg')

List = []

#read height and width of template image
w, h = template.shape[0], template.shape[1]

res = cv2.matchTemplate(img_rgb,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.95
loc = np.where( res >= threshold)

for i in zip(*loc[::-1]):
    location = (i[0] + w, i[1] + h)
    List.append([i, location])

    cv2.rectangle(img_rgb, i, location, (0,255,0), 20)

img_rgb = cv2.resize(img_rgb,(800,600))
cv2.imshow("result",img_rgb)
cv2.waitKey(10000)

在此处输入图像描述

在此处输入图像描述

通常我使用 0.8 的阈值,但在本例中,我使用 0.95 以获得更清晰的效果。这就是结果:

在此处输入图像描述

这表明代码确实有效。现在,问题来了。

我想确定显示的反应角的中心点。这可以使用使用矩形角的简单代码来确定:

xCenter = (i[0] + i[0] + w)/2
yCenter = (i[1] + i[1] + w)/2

我可以在 for 循环中使用此代码,它为我提供了找到的每个 ractangle 的中心 xy 坐标。

当我打印这个 xy 坐标(以及列表)时,我希望有一个 xy 坐标,但是我可以看到一个完整的坐标列表,它们之间只有一点点不同:

#Locations of the center xy-coordinates:
(1527.5, 770.5)
(1525.5, 771.5)
(1526.5, 771.5)
(1527.5, 771.5)
(1528.5, 771.5)
(1529.5, 771.5)
(1525.5, 772.5)
(1526.5, 772.5)
(1527.5, 772.5)
(1528.5, 772.5)
(1529.5, 772.5)
(1524.5, 773.5)
(1525.5, 773.5)
(1526.5, 773.5)
(1527.5, 773.5)
(1528.5, 773.5)
(1529.5, 773.5)
(1530.5, 773.5)
(1525.5, 774.5)
(1526.5, 774.5)
(1527.5, 774.5)
(1528.5, 774.5)
(1529.5, 774.5)
(1525.5, 775.5)
(1526.5, 775.5)
(1527.5, 775.5)
(1528.5, 775.5)
(1529.5, 775.5)
(1527.5, 776.5)

所以发生的情况是,模板在同一个位置被多次找到,只有很小的坐标差异(大约 5px)。

我想要的是代码只返回一个中心 xy 坐标,为此我只需要一个矩形。我的问题是:如何做到这一点?例如,是否有能够识别微小差异并能够过滤掉它们的代码?

我希望这个问题现在更清楚了。

问候, Ganesh

标签: python-3.xopencv

解决方案


推荐阅读