OpenCV模板匹配,多个模板

11

我正在尝试制作一个游戏机器人。基本上,它会从地面上捡起物品,问题是这些物品有时看起来不同,比如角度不同或者它们放在了不同颜色的地面上等等。为了使一切正常工作,我需要多个模板。有没有什么办法可以做到这一点?如果你不理解,请在评论中告诉我。以下是我目前尝试过的内容:

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)

这个可以运行,但还有改进的空间。你有什么想法吗?

1个回答

10

在您当前的代码中,有很多步骤被重复执行了多次,而只需要执行一次(每帧)。通过将它们分开,您可以获得效率。

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

哇,这帮了我很多!感谢您的所有帮助。还能给我的问题点个赞吗?我快要被禁言了 :/ - Stasiek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接