OpenCV模板匹配,多模板
OpenCV template matching, multiple templates
我正在尝试为游戏制作机器人。基本上它从地上捡起物品,这些物品有时看起来不一样。角度不同或它们位于不同颜色的地面等。为了使一切正常,我需要多个模板。有什么办法吗?如果您不明白,请在评论中告诉我。到目前为止,这是我尝试过的:
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 次以上。而是创建一个包含模板的列表,以便它们保留在内存中。从内存访问比从磁盘加载快得多。
您可以对模板的 width/length 做同样的事情,但它实际上并没有在您的代码中使用,所以也许您可以一起跳过它。
阈值只需设置一次。
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)
我正在尝试为游戏制作机器人。基本上它从地上捡起物品,这些物品有时看起来不一样。角度不同或它们位于不同颜色的地面等。为了使一切正常,我需要多个模板。有什么办法吗?如果您不明白,请在评论中告诉我。到目前为止,这是我尝试过的:
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 次以上。而是创建一个包含模板的列表,以便它们保留在内存中。从内存访问比从磁盘加载快得多。
您可以对模板的 width/length 做同样的事情,但它实际上并没有在您的代码中使用,所以也许您可以一起跳过它。
阈值只需设置一次。
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)