OpenCV模板匹配,多个模板

时间:2019-06-19 11:53:42

标签: python opencv templates template-matching

我正在尝试为游戏制作机器人。基本上,它是从地面上捡起物品的,但有时这些物品看起来有些不同。角度是不同的,或者它们躺在不同颜色的地面等上。要使一切正常,我需要多个模板。有什么办法吗?如果您不明白,请在评论中告诉我。这是我到目前为止尝试过的:

String script = "return document.getElementsByName(\"origin\").value";

这有效,但可能会更好。你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在您当前的代码中,有很多步骤执行多次,而一次(每帧)就足够了。通过将它们分开可以提高效率。

您当前正在每帧上重新加载模板,这效率非常低,因为您很容易每秒获得100多个加载。而是创建一个保存模板的列表,以便它们保留在内存中。从内存访问比从磁盘加载要快得多。
您可以对模板的宽度/长度执行相同的操作,但实际上并未在代码中使用它,因此也许可以一起跳过所有内容。
阈值只需设置一次。

templates = []
templ_shapes = []
threshold = 0.70

for i in range(6):
    templates.append(cv2.imread("bones_{}.png".format(i),0))
    templ_shapes.append(templates[i].shape[:: -1])

所有模板都可以与同一个屏幕抓图进行比较,因此您应该将其放在for循环之外。这是一个轻松但相当大的胜利。因此,在每一帧上,只抓屏一次,然后匹配所有模板。为了清楚和方便起见,您可以将其放在函数中:

def doTemplateMatch():
    img_gray = cv2.cvtColor(imageGrab(), cv2.COLOR_BGR2GRAY)
    for template in templates: 
        res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
        loc = np.where( res >= threshold)