我在阅读关于opencv和python模板匹配的文档,在最后一部分关于多个对象的模板匹配,代码检测马里奥图像上的19个硬币,但是,是否有可能用python上的一些函数(如len()或任何opencv方法)来计算检测到的对象数量?
下面是教程中显示的代码:http://docs.opencv.org/3.1.0/d4/dc6/tutorial_py_template_matching.html
模板匹配代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
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)
字符串
结果是:Mario Bros & Coins
那么,有没有办法计算图像上检测到的硬币并在终端上打印数字呢?比如:
The Template Matching code showed before...
print "Function that detect number of coins with template matching"
>>> 19
型
7条答案
按热度按时间7jmck4yq1#
我找到了一个合适的解决方案(对于我的应用程序),按照Ulrich的建议计算唯一匹配。这并不理想,但对我的应用程序来说,使用“灵敏度”通常会产生+/- 2%的结果。
字符串
w6lpcovy2#
我做了一个所有匹配的列表,对于每一个新的匹配,我检查是否有一个与边界框相交的列表中的任何匹配:
字符串
这是检查交叉点的代码:
型
dm7nw8vv3#
我也遇到过类似的问题。以下是我的解决方案:
字符串
我不明白它是如何工作的。我只是从GeeksforGeeks复制了这个。所以不要指望我能回答你的问题。但我会尽我所能回答它。我希望这对你有帮助。
k3bvogb14#
我使用一个列表来存储许多相同对象检测的第一个(x,y)。然后对于找到的检测中的每个(x,y)(同一个物体上必须有许多检测),我计算新的(x,y)和列表中每个点之间的距离。如果距离足够大,它必须是新检测的第一个发现。然后我把新的(x,y),y)的名单。这是愚蠢的,但真的有效。
其目的是删除第一次检测对象的(x,y)附近的点,只保留该“组”中的一个点,然后将所有点都放入loc中以定位更多的“组”,并在每个组中找到一个且唯一的一个点。
字符串
gudnpqoy5#
对于任何仍然想知道的人:首先对列表“zip(*loc[::-1})”进行排序要容易得多。
因为我的脚本返回的结果是这样的:
字符串
你会注意到,有多个重复,但不仅仅是按顺序。现在只需使用“sorted(zip(*loc[::-1]))”进行排序,就可以轻松获得距离,只需计算相邻的2个点并检查每个循环的距离。
通过在循环中添加条件并检查当前点的距离是否小于期望值,可以很好地完成工作。我从未正确学习过python,所以我不确定这是不是有效的方法..至少这对我的用例有效。你可以在下面检查它。
Source code (Github) / Test Result (Imgur)
示例代码:
型
35g0bw716#
我就是这么做的:
字符串
loc是2D数组。
9o685dep7#
导入时间导入cv2从PIL导入numpy作为np导入ImageGrab
为真时:
字符串