从游戏背景提取精灵 - nanpuhaha/SerpentAI GitHub Wiki

Serpent.AI 框架附带了一个功能函数,利用此功能可以从图像背景中分离出精灵。

问题

我们要从 OpenRCT2 游戏的主菜单提取并注册游戏精灵。感兴趣的目标区域看起来如下所示:

上面这个样例可能看起来已经非常合适了,但如果你观察到更仔细一些,你会发现这些按钮的绿色背景区域中其实有一些半透明的情况出现。这意味着背景中的像素会随着背景动画的变化而改变颜色。框架所提供的精灵定位及识别方法容易受到这种情况的影响,大部分情况下都会失效。

解决方案

当你面对诸如这样的精灵时,正确的处理方法是将静态像素与动态像素隔离开,从而产生具有透明度的 PNG。 然后将这个具有透明度结果的 PNG 图像与游戏插件捆绑在一起,这样就能够成功地检测并识别该精灵了。

让我们一起来看一下要实现该目标所需的步骤!

在游戏插件中添加按钮的屏幕区域

像往常一样,我们首先要做的是添加一个屏幕区域来界定游戏插件中的按钮。我以这张图片中的 Load Game 按钮为例子。首先测量其边界框坐标,并将此条目添加到屏幕区域:

"MAIN_MENU_LOAD_GAME": (626, 429, 708, 510)

捕获按钮所在的屏幕区域

接下来,我们要捕获该屏幕区域的几个不同的示例。请确保你已通过 serpent launch 命令启动游戏,并运行以下命令:

serpent capture region OpenRCT2 1 MAIN_MENU_LOAD_GAME

让捕获程序运行大约 30 秒,然后用 Ctrl-C 操作中断它。

切换到 datasets/collect_frames/MAIN_MENU_LOAD_GAME 目录,你应该看到如下所示的情况:

抽取按钮精灵

在 IPython 或者 Jupyter Notebook 程序里,敲入一下代码:

import serpent.cv

serpent.cv.isolate_sprite("datasets/collect_frames/MAIN_MENU_LOAD_GAME", "sprite_main_menu_load_game_0.png")

欣赏结果

打开 sprite_main_menu_load_game_0.png 文件你应该看到像这样的图像:

棒呆了!

你现在可以将这个带有透明区域的精灵图像打包到游戏插件中以备以后使用了。