前几周,很流行一个手机游戏,叫《家国梦》。我在手机上玩了一两天后,发现了两个问题:
1. 收货收金币太没意思,只需要手指滑在固定的路线,一会儿就烦了
2. 怎么追赶也追不上手快的人(当然也需要一定策略)
我刚玩这个游戏的时候,还能在好友里排名第一,三四天后就落到了第三,真是比不过年轻人。。。
正好最近在研究LabVIEW里面关于Vision的东西,就思考了一下能不能做个自动收货收金币的程序,晚上临睡前开起来,早上起床时候红包就可以收获很多。说干就干!
整体思路就是用图像识别的算法识别小火车上面是什么货,然后把货物运到对应的建筑物那里。
经过对截图的研究,发现游戏有如下特点:
1. 小火车每次停留最长约90s,而且每次最多运3种货物,没种货物数量一般都在5个以内
2. 小火车上面的货物会随机掉落一些奖励(后来我同事告诉我其实有策略的,但我也懒得去考虑了)
3. 点击建筑物可以收获金币,并且也会随机掉落奖励(红包、蓝星币、贡献值)
基于以上三点,就可以设计起来我们的框架了。
1. 首先要有一个while loop一直在跑,这样才能不停地识别、操作货位,在这里while loop设置成一次跑4s
2. 然后在while loop里面要不断地跑这几个模块:采集图像、识别目标、搬运货物(收金币)。
这里我们用的是蓝叠模拟器跑《家国梦》这个游戏,因为不需要真机,而且它也支持ADB,所以会很方便。
一开始我想的是,把Android模拟器开在桌面上,然后用LabVIEW对整个桌面截图,再把游戏的那部分截图抠出来。这样我也尝试去实现了,但是效果不大好,因为抠出来的游戏图案部分,和Android模拟器的分辨率不一样,也就是说模拟器把显示的大小做了压缩。
所以我就干脆直接用ADB截图,截完图传到PC,然后再做分析。ADB截图指令参考了这个帖子:https://www.cnblogs.com/guoguojiang/p/10347211.html
1. 用ADB发送截图指令
2. 用ADB指令把截图传到PC上
3. 用Vision里的API去打开本地的png文件,并准备传给后续的图像处理部分。
4. 删除刚刚传过来的图片
在LabVIEW的vision工具包里,有专门用于pattern matching的API,那么我这里选用了我之前用过的几何匹配API。集合匹配的大概意思就是,找到模板里面,能用几何线条描述的特征,然后存下来去和目标图匹配。
1. 首先要截出不同的模板,把所有的特征部分图案截取出来,另存为png文件。在这里要注意的是,有些特征可能会随机出现在三段车厢的任意一个车厢上,模板的团略有不同,需要多截图几张在不同车厢的图。
2. 整个算法流程是,先load所有的模板(因为load模板很慢,所以要先load好),然后对采集的图像做几何模板匹配,如果找到了模板的团,就把它滑动到对应的建筑物那里。如果没有找到模板,那就收集建筑物那里的金币。
在这里有一些优化算法的小办法,例如设置ROI为小火车周围的一小片区域,这样索索范围会大大减小。通过这种匹配算法,就可以把货物的坐标找到,传给后面的搬运货物模块。
原文:https://www.cnblogs.com/sonwendi/p/11716667.html