在图像内部查找图像(使用CV2)

时间:2019-09-19 21:17:03

标签: python opencv

我正在使用CV2,并且想要检测图像内部的图像。情况如下:

Base Image

我有此基本图像,并且我试图检测显示的当前字符。游戏中大约有30个角色,所以我正在考虑为每个角色(character1.png,character2.png等)制作一个png,以便可以找到用户正在玩的当前角色。这是 character1.png 模板的示例:

Template

我想使模板与图像的那个区域匹配。问题是,如果游戏中有多个人在扮演同一角色,那么他们的角色也会被检测到。但是,我只希望检测到客户的角色。客户的角色将始终位于游戏的左下象限。

这是我的代码:

import cv2
import numpy as np

img_bgr = cv2.imread('base.png')
img_gry = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

template = cv2.imread('search.png', 0)

w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gry, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)

for pt in zip(*loc[::-1]):
    cv2.rectangle(img_bgr, pt, (pt[0]+w, pt[1]+h), (0,255,255), 2)

cv2.imshow('detected', img_bgr)

到目前为止,它的功能与我想要的一样。它将黄色矩形放在字符周围:

Example

但是,如果有多个具有相同角色的人,那么也会发现其他人的角色。我想知道cv2中是否存在仅在基本图像的特定区域(客户端字符所在的左下区域)内搜索的功能。而且,我不需要显示黄色矩形,这只是一个测试。因此,我想知道是否可以在区域中找到该模板,让cv2说“检测到字符1”,“检测到字符2”,等等。

因此,基本上,我希望我的程序循环遍历character(1-30).png,一旦它找到客户端正在播放的正确字符,它就会说“您正在播放N(n = 1) -30)。我想知道这是否是检测客户角色的有效方法。

1 个答案:

答案 0 :(得分:0)

您可以选择字符所在区域的ROI(关注区域)。然后检查是否仅在此区域找到模板:

import cv2
import numpy as np

img_bgr = cv2.imread('base.png')
img_gry = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

template = cv2.imread('search.png', 0)

w, h = template.shape[::-1]
roi_start = (430, 550) # top left corner of the selected area
roi_end = (526,651) # bottom right corner of the selected area

roi = img_gry[roi_start[1]: roi_end[1], roi_start[0]: roi_end[0]]
res = cv2.matchTemplate(roi, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
    if pt is not None:
        print("character found")
        break