我一直在努力开发一个小型爱好项目,该项目涉及将玩家的位置从游戏中绘制到热图上,以查看最活跃区域在不同时间点的位置。
我对OpenCV及其工具有点新意,但我成功地在游戏中的记分板和计时器上成功运行了一些文本匹配和提取,现在试图从游戏中获取角色的位置小地图。
看起来像这样,这是我能够得到的最大分辨率图像(约185x185):
我正试图获得只有两件事的位置:角色(大圆圈)和“病房”,由这些图标表示:
所以考虑到他们的资产,我认为因为源图像中存在太多“噪音”,我会尝试从其图像中减去游戏迷你图中的背景,然后尝试模式匹配原始图像将得到的图像放在一起的字符和病房图像(这意味着是小地图,减去其背景)。但是,你甚至没有接近工作,你可以看到:
> >
即使这确实有效,我也不确定如何处理图标部分相互覆盖的情况,或者我如何获得那些小病房标记的位置。
我真的很感激一些帮助,因为我一直在互联网上搜索,并且几天没碰到任何东西。我已经尝试了一系列不同的技术,阅读指南和文章,并尝试了一些GUI工具来试验,但没有更接近一种方法来解决这个问题。
请帮助我使用我可以或应该使用的技术来获取所有角色和病房的位置。
答案 0 :(得分:0)
我不是OpenCV用户,但我可以解决一些常见问题。
首先,你要减去背景地图。看起来你对地图的RGB值进行了直接的算术减法。例如,左下角的蓝队图标大致为#99FFFF,您可以减去可能#D0D0FF的灰色背景。这会留下#002F00,非常深绿色。
另请注意,您要删除原始地图,而不是显示的部分。超出视图的路径以阴影显示,但您似乎减去原始值。
你需要减去的是一个蒙面背景。不幸的是,构建该掩码意味着您必须找到图标。在这个阶段,掩蔽不会很好。
回到减法:不要盲目地减去。相反,寻找色调匹配。当你找到一个色调匹配时,只需将该像素设置为0.你需要注意两个特殊情况:背景上的图标是他们自己的颜色,特别是对于蓝队。在这种情况下,您需要定义区域边界。
从与原始背景完全匹配的像素开始。它不会被遮挡,因为所有这些问题像素都只是一个图标。只要您与原始背景颜色完全匹配,就从该像素扩展。这将为您提供可以删除的区域。
您的下一个问题是识别图标。你现在应该有一个只有图标的地图,其中很多都是完全透露的。那些很容易搭配;识别并减去它们,一次一个关键图标。
您现在拥有部分图标的地图。切换匹配算法:键图标现在与确切颜色匹配,或为黑色(表示之前已覆盖)。迭代直到你没有更多的匹配。
此确实仍然会给您带来一个问题:一个图标不再显示足够的像素来识别。这些图标将被完全覆盖或覆盖,除了一小部分不是唯一的,例如红色圆形边框的几个像素。
为此,一般方法是在很小程度上跟踪游戏进度:从较早的时间开始,您知道使用的图标的位置。将每个图标作为软件对象进行跟踪。如果其他图标覆盖它,则假设它仍然存在,直到您发现其他情况。
这将处理大多数情况。从传说中的图标下方射出的小兵或传感器仍然存在一些问题,但我相信你的热图应用程序并不是那么脆弱,以至于不能从这种情况中获取造型损伤。传说很快就会移动,揭示了小物品的死亡。一个移动的奴才长久没有被传说所覆盖;他们不会以同样的智慧行动。