【问题标题】:OpenCV template matching, multiple templatesOpenCV模板匹配,多个模板
【发布时间】:2019-06-19 11:53:42
【问题描述】:

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

files = ["bones_{}.png".format(x) for x in range(6)]

    for i in range(6):
        img_gray = cv2.cvtColor(imageGrab(), cv2.COLOR_BGR2GRAY)
        f = str(files[i])
        template = cv2.imread(f, 0)
        w, h = template.shape[:: -1]
        res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
        threshhold = 0.70
        loc = np.where( res >= threshhold)

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

【问题讨论】:

    标签: python opencv templates template-matching


    【解决方案1】:

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

    您目前正在每帧重新加载模板,这非常低效,因为您很容易每秒获得 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)
    

    【讨论】:

    • 哇,这对我帮助很大!感谢所有的帮助。你也可以支持我的问题吗?我处于被禁止的边缘:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2018-07-15
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多