我正在使用CV2,并且想要检测图像内部的图像。情况如下:
我有此基本图像,并且我试图检测显示的当前字符。游戏中大约有30个角色,所以我正在考虑为每个角色(character1.png,character2.png等)制作一个png,以便可以找到用户正在玩的当前角色。这是 character1.png 模板的示例:
我想使模板与图像的那个区域匹配。问题是,如果游戏中有多个人在扮演同一角色,那么他们的角色也会被检测到。但是,我只希望检测到客户的角色。客户的角色将始终位于游戏的左下象限。
这是我的代码:
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)
到目前为止,它的功能与我想要的一样。它将黄色矩形放在字符周围:
但是,如果有多个具有相同角色的人,那么也会发现其他人的角色。我想知道cv2中是否存在仅在基本图像的特定区域(客户端字符所在的左下区域)内搜索的功能。而且,我不需要显示黄色矩形,这只是一个测试。因此,我想知道是否可以在区域中找到该模板,让cv2说“检测到字符1”,“检测到字符2”,等等。
因此,基本上,我希望我的程序循环遍历character(1-30).png,一旦它找到客户端正在播放的正确字符,它就会说“您正在播放N(n = 1) -30)。我想知道这是否是检测客户角色的有效方法。
答案 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