gpt4 book ai didi

python - OpenCV模板匹配,多模板

转载 作者:太空宇宙 更新时间:2023-11-03 23:07:09 28 4
gpt4 key购买 nike

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

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)

这行得通,但还可以做得更好。你有什么想法吗?

最佳答案

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

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

关于python - OpenCV模板匹配,多模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667067/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com