Python OpenCV 游戏地图识别与处理函数: get_bw_map()
def get_bw_map(self, gs=1, sbl=0):
# 定义颜色阈值
yellow = np.array([145, 192, 220])
black = np.array([0, 0, 0])
white = np.array([210, 210, 210])
sblue = np.array([222, 198, 121])
gray = np.array([55, 55, 55])
# 定义地图大小
shape = (int(self.scx * 190), int(self.scx * 190))
# 如果传入参数gs为真,则获取当前屏幕截图
if gs:
self.get_screen()
# 获取局部截图
local_screen = self.get_local(0.9333, 0.8657, shape)
# 创建黑白地图
bw_map = np.zeros(local_screen.shape[:2], dtype=np.uint8)
# 根据颜色阈值将黄色区域标记为200
bw_map[np.sum((local_screen - yellow) ** 2, axis=-1) <= 800 + self.find * 800] = 200
# 根据颜色阈值将白色区域标记为255
b_map = (np.sum((local_screen - gray) ** 2, axis=-1) <= 3200 + self.find * 1600)
bb_map = deepcopy(b_map)
b_map[2:] |= bb_map[:-2] | bb_map[1:-1]
b_map[:-2] |= bb_map[2:] | bb_map[1:-1]
b_map[:, 2:] |= bb_map[:, :-2] | bb_map[:, 1:-1]
b_map[:, :-2] |= bb_map[:, 2:] | bb_map[:, 1:-1]
bw_map[(np.sum((local_screen - white) ** 2, axis=-1) <= 3200 + self.find * 1600) & b_map] = 255
# 如果传入参数sbl为真,则将蓝色区域标记为150
if sbl:
bw_map[np.sum((local_screen - sblue) ** 2, axis=-1) <= 400] = 150
# 根据游戏进程阶段对地图进行裁剪
if self.find == 0:
bw_map = bw_map[int(shape[0] * 0.5) - 68:int(shape[0] * 0.5) + 108,
int(shape[1] * 0.5) - 48:int(shape[1] * 0.5) + 128]
else:
bw_map = bw_map[int(shape[0] * 0.5) - 68 - 2:int(shape[0] * 0.5) + 108 - 2,
int(shape[1] * 0.5) - 48 - 8:int(shape[1] * 0.5) + 128 - 8]
# 将地图外的区域标记为0
for i in range(bw_map.shape[0]):
for j in range(bw_map.shape[1]):
if ((i - 88) ** 2 + (j - 88) ** 2) > 85 ** 2:
bw_map[i, j] = 0
# 如果传入参数sbl为真,则进行目标搜索
if sbl:
ii, jj = 30, 30
cv.imwrite('imgs/sbl.jpg', bw_map)
for i in range(-20, 21):
for j in range(-20, 21):
if np.sum(bw_map[88 + i - 1:88 + i + 2,
88 + j - 1:88 + j + 2]) == 150 * 9 and i ** 2 + j ** 2 < ii ** 2 + jj ** 2:
ii, jj = i, j
bw_map[bw_map == 150] = 0
if ii ** 2 + jj ** 2 < self.his_loc[0] ** 2 + self.his_loc[1] ** 2:
self.his_loc = (ii, jj)
# 将标记为150的区域转换为0,将标记为200的区域转换为255
bw_map[bw_map == 200] = 255
# 如果游戏进程阶段为0,则将黑白地图保存为文件
if self.find == 0:
cv.imwrite(self.map_file + 'bwmap.jpg', bw_map)
return bw_map
原文地址: https://www.cveoy.top/t/topic/ol5y 著作权归作者所有。请勿转载和采集!