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
Python OpenCV 游戏地图识别与处理函数: get_bw_map()

原文地址: https://www.cveoy.top/t/topic/ol5y 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录