作者:Zero,腾讯测试开发工程师

本文由腾讯 WeTest 授权发布,如需转载请联系腾讯 WeTest 获得授权。

WeTest 导读

Pokémon Go 一出,新鲜的玩法、经典的 IP 效应让这款使用了 Unity 以及 AR 技术的手游火遍了 “大洋” 南北。可惜的是这款新鲜的游戏还没有惠及中国市场的玩家们。腾讯内部的 AR 专家秉持着 “一言不合就自己开发” 的原则,自发对 AR 游戏进行了预研,本文将通过在 Unity 中对 OpenCV 及 Vuforia 库的使用,简单介绍制作 AR 游戏的一系列流程。

如果你在街头巷尾
看到这样拿着手机到处晃悠的景象
他们一定是在抓小精灵!
图片描述
图片描述

图片描述
《Pokémon Go》采用 AR 技术
只需一台自带 GPS 功能的智能手机
就可以满世界地找小精灵
然后扔精灵球以捕获精灵
那么问题就来了
AR 技术是什么?

增强现实(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。简单的说,在 Pokémon Go 这款 AR 游戏中,精灵是虚拟的, 地图是真实的,虚拟的精灵出现在了真实的地图之中,给了玩家十分新鲜的体验。

于是
Pokemon Go 拯救了无数的死宅们
大家上街抓
图片描述

上厕所也抓
图片描述

不过,Pokémon Go 现在还拯救不了国内的死宅们
目前 Pokémon Go 在国内已被锁区
而解锁的时间还不确定。。。

然而!腾讯的技术大牛在遇到新鲜事物的时候是拦不住的!秉持着 “一言不合就自己开发” 的原则,大牛决定,自己做一个 AR 游戏!!
Pokémon Go 的游戏引擎用到了 Unity 技术,在腾讯大牛预研的 AR 游戏中,分别用到了 OpenCV 及 Vuforia 库,下面将简单分享下两个库的使用。
图片描述
想收服小萝莉吗?

一、OpenCV 篇
OpenCV 是英特尔发起并参与开发的计算机视觉库,在图像处理、模式识别及计算机视觉领域被广泛使用,这里就不做过多介绍了。

1.1 OpenCVForUnity
Unity 有现成的 OpenCV 库,使用起来很方便。
具体使用方法:
1.导入 OpenCV for Unity.unitypackage
2.将导入后 OpenCVForUnity 目录下的 Plugins 和 StreamingAssets 文件夹移到 Assets 目录下
OpenCVForUnity 目录下的 Samples 里有很多写好的示例,比如阈值分割、霍夫变换检测直线、人脸检测等,如果想运行需要在 Build Settings 里添加好对应场景,其中有的需要用到摄像头。
图片描述
图片描述

1.2 OpenCV 在 Unity 中的应用
背景是组里基于 Unity 做的一个 AR 小游戏——打飞碟,其中使用 OpenCV 实现了红外效果及人脸检测:
红外模式:
图片描述
图片描述

当场景中出现了半透明的敌机时,可开启红外模式看清隐形敌机的位置。
这里主要用 OpenCV 对摄像头获取的图像做了颜色变换:首先将图像转为灰度图 (cvtColor),然后基于某个色谱,根据不同的灰度值映射为不同的颜色 (applyColorMap)。
对于此类滤镜也可以通过 Unity 的 Shader 来做(如下图),相比 OpenCV 性能要好些,但 OpenCV 做图像处理更灵活,也可以尽量去优化:
1.限制图像的更新频率;
2.降低图像的分辨率(OpenCV 可以用 resize);
3.对于必要的 Mat 可以在类初始化时申请好空间,不用每次处理图像都申请再释放;
4.利用多线程(主要用在了人脸检测模块)。
图片描述

好友助战:
图片描述
遇到强大 Boss 时,可将摄像头对准好友(人脸),当检测到人脸时,会出现好友助战剧情,协助攻击 Boss。

面具怪:
图片描述
同好友助战模式也利用了人脸检测,当在图像中检测到人脸时,会出现附着在人脸上的面具怪,并跟随其移动。
首先,简单区分下人脸检测和人脸识别这两个概念:人脸检测是找到图像中人脸的位置、大小,而人脸识别不仅要检测出人脸,还要知道这人是谁。
OpenCVForUnity 中的人脸检测示例用到了基于 Haar 特征及 LBP 特征的两种分类器来检测人脸(已经训练好的分类器,想自己训练或者自己实现性能更优的算法可以去咨询优图~),同时也用到了多线程来异步计算,对于在性能较差的移动设备上来实现人脸检测具有较好的参考性。
对于移动设备,人脸检测计算量较大(Unity 本身开销已经不小了),所以不能对每帧图像都进行检测,可以利用多线程进行异步计算:
图片描述

好友助战模式是检测到人脸后,在人脸上添加一些装饰物(copyTo 用装饰物的 PNG 图片做掩膜)作为剧情的一部分;而面具怪则是根据检测到人脸的位置和大小来改变怪物的位置和大小。此外,如果进一步需要进行人脸识别,那不建议在移动设备上做,性能肯定吃不消了,可以用云,将计算放在服务器上。

二、Vuforia 篇
Vuforia 是高通的增强现实库,对 unity 支持好,使用起来简单方便,如下图所示为组内使用 Unity+Vuforia 开发的坦克大战 AR 版:通过识别预先设定的标志物(此处为 lena 头像),从而确定游戏世界所在的平面及大小,和实景结合展现出坦克大战游戏场景。
图片描述

简要介绍下 Vuforia 在 Unity 中的使用:
1.在官网注册账号后,首先注册一个 License,并记下 License Key;
图片描述
图片描述
2.下载 Vuforia 库导入到 Unity 中;
3.选取一张待识别图片上传到 Target Manager,如下图所示
创建 Database:
图片描述
添加待识别图片:
图片描述
4.生成库后,注意 Rating 的星级,越高越好(识别度越高);将库下载下来导入到 Unity 中。
图片描述
图片描述
5.在 Unity 中搜索 ARCamera 和 ImageTarget,并拖到场景中,ARCamera 中的 App License Key 填入刚才申请的 License Key,Database Load Behaviour(Script) 中勾选” Load QQ Database”(这里根据 Database 的名字有所不同)和” Activate”,在 ImageTarget 中的 Database 选择刚才申请的识别图片 Database 的名字 (QQ),此时场景中会出现识别图片
图片描述
图片描述
6.根据识别图片 (ImageTarget) 的相对位置将游戏物体或场景作为 ImageTarget 的子物体进行摆放。
图片描述
图片描述
7.按照上述步骤即可在 Unity 中简单使用 Vuforia 库,如果有更多需求可以去了解下它的其他功能及 API;例如,为了增强识别效果,可以加入摄像头的对焦:
Vuforia.CameraDevice.Instance.SetFocusMode(Vuforia.CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);
在实际使用中,Vufroia 库简单易用,识别准确度较高,对手机性能消耗适中,但构建的虚拟场景容易因环境干扰发生一定抖动,影响玩家游戏体验;可同时识别多个物体,但准确度有所降低;长时间游戏会导致摄像头发烫。

为了避免以上手游性能方面对游戏的负面影响,可以利用一些现成的测试工具进行深度的检测,腾讯 WeTest 平台下的 Cube 工具可以帮助开发者发现游戏内分类资源的一个占用情况,尤其是对游戏场景中的 FPS、CPU、PSS 的变化趋势重点关注,帮助在游戏开发过程中不断改善玩家的体验。目前功能还在免费开放中。

体验地址:http://wetest.qq.com/cube
关于测试报告的问题:http://wetest.qq.com/guide/view/?id=267
使用帮助:http://wetest.qq.com/guide/view/?id=266
常见问题:http://wetest.qq.com/guide/view/?id=268


关于腾讯 WeTest
腾讯 WeTest 是腾讯游戏官方推出的一站式游戏测试平台,用十年腾讯游戏测试经验帮助广大开发者对游戏开发全生命周期进行质量保障。
腾讯 WeTest 提供:兼容适配测试;云端真机调试;安全测试;耗电量测试;服务器压力测试;舆情监控等服务。


↙↙↙阅读原文可查看相关链接,并与作者交流