目标
移动端没有鼠标键盘手柄等外接设备,需要手动绘制虚拟按键来操作游戏。游戏场景不同按键也相应不同,目前的方案是在游戏过程中绘制大部分甚至全部按键,
虽然避免了由于按键缺失导致不能玩游戏的问题,但是带来了视觉干扰的不良用户体验。因此在游戏过程中,根据游戏场景的不同只绘制相应的按键就变得很有必要和紧迫。
进展
最近三个月的主要工作就是游戏场景识别,选择"团队xxx"这款游戏进行适配,对如下9个场景进行识别:游戏初始页、游戏选单1(主画面)、游戏选单2(选择角色)、剧情介绍、
载入游戏、开始xx、游戏暂停、游戏回合结束、离开游戏。先在pc平台上测试通过,然后移植引擎库并对接android平台,完成测试demo。
对游戏初始页、游戏选单1(主画面)、游戏选单2(选择角色)、游戏暂停、游戏回合结束等简单通用场景,识别率基本上能够达到90%;
对"开始xx"这一背景变大较大的场景进一步优化适配,识别率达到95%;
对"剧情介绍"、"载入游戏"等背景变大较大场景未做优化适配,只能识别到具体关卡的"剧情介绍"、"载入游戏"场景。如果用户玩游戏的其它关卡则识别不到,
可以参考优化适配"开始xx"场景进行同样的优化就能解决此类问题,因为是重复性的工作所以暂时没有做。
存在问题
1、目前只对团队xxx这一款游戏进行适配,未适配其它游戏。适配需要找到场景的特点进行识别,并且逐个游戏进行适配;
2、利用opencv获取到图像的sift特征,然后根据faiss相似度算法进行匹配,复杂的场景存在5%比例的误识别情况;
3、faiss工程包含了多种相似度对比算法,目前用的是L2距离算法,计算量大,识别一帧大概需要1.3秒左右,距离300毫秒的实时性目标还有较大距离;
4、移动端目前只在android手机上完成了测试demo,ios平台的demo没有对接;
步骤
1、引入无锁缓冲队列,解码线程将解码后的帧放入无锁队列中;
2、启动场景识别线程,从无锁队列中读取视频帧,然后进行场景识别:
2.1、对当前视频帧进行hash变换,跟目标参考图像的hash值进行对比,过滤掉不相关的视频帧;
2.2、对通过hash运算的当前视频帧进一步处理,调用faiss的相似度查找算法;
2.3、将匹配成功的目标参考图像名称上报给应用端,应用端绘制对应的虚拟按键;
3、对"开始xx"场景进一步优化,因为该场景的背景变换非常大,而前景基本一致,所以需要先对图像进行前景提取,然后根据提取到的前景进行匹配查找;
备注:因为hash算法较快,处理一帧200毫秒左右,所以先用图像hash过滤掉大部分不相关的帧,然后用耗时较多的faiss算法进一步查找;
hash算法可能会误识别,所以需要faiss算法进一步处理。
所有代码均已提交到git仓库的game_engine项目的dev_pic分支上。
下一阶段方向
利用传统的图像处理算法+开源的相似性搜索工程faiss,对单一的"团队xxx"游戏的特定场景进行识别,大部分通用场景都能达到90%的识别率,"开始xx"场景可以达到95%,
但是实时性还有很大的空间可以优化,对faiss工程的其他算法还有待进一步的深入理解。demo阶段暂时告一段落,后续等引入深度学习框架后测试其效率和准确性,
等决定将hash+faiss算法作为辅助的检测手段后,再进一步的提高实时性和准确率。
参考资料
https://zhuanlan.zhihu.com/p/68215900?from_voters_page=true
https://github.com/facebookresearch/faiss/wiki/Getting-started