python-3.x - 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
解决方案
推荐阅读
- javascript - 带有 mat-select 的角度动态表单无法获取值访问器
- windows - Nasm - 通过未初始化变量的“真实”随机性?
- html - 使用带有 minmax 的重复自动调整防止 CSS 网格列溢出(
, 1f) - google-sheets - 根据包含在某一列上的数据,使用哪些函数来交替行组的颜色?
- angular - Angular Material MatMomentDateModule 导入所有 Moment 语言环境
- jquery - almasaeed2010/adminlte v2.4.18 需要 bower-asset/jquery
- angularjs - 与 Django 的数据表集成
- c++ - C++ 中的 Lambda 泛型
- java - Error instantiating servlet class [*] 如何解决这个错误
- google-apps-script - 让按钮用另一张纸上的列中的下一个可用数字自动填充单元格的最佳方法是什么?