动感光波发射!Unity AR开发之 3d 物体识别小记

导语

玩过 unity3d AR的童鞋应该知道,在 Unity3d 中配合Vuforia 库可以很轻松地识别图片并在上面建立模型。然而,在 vuforia 官网中,不仅可以识别图片,还可以识别几何体,特别是从 vuforia4.x 开始支持识别更不规则的3d物体。本文将详细介绍如何在 Unity3d 中用 Vuforia 做简单的3d物体识别。

文章将分为 vuforia 识别过程和 unity 开发过程两部分进行描述。

Vuforia识别过程

1 . 需要在Vuforia官网上做的准备

在开始之前,需要在官网上注册自己的账号,才能新建app,获得自己的license(后面需要用到)和上传需要识别的图片或物体作为target。

2 . 选取需要识别的物体

对于3d物体的识别,需要符合以下几点标准:

  • 不透明的刚性物体,并且物体没有可移动的部位
  • 表面特征较有对比度,不支持柔软的或者可以变形的物体
  • 不规则的图案或者形状越多识别会越好
  • 不能太光滑导致有反光效果

例如一些玩具公仔、玩具车,都是比较好的识别对象

3 . 打印识别图,物体需要放在右上角的网格中进行识别,打印如下所示的识别图时需要注意控制尺寸大小,让网格大小和物体的大小刚刚好是符合的,这样可以便于之后的识别过程更加精准(后面将详细解释)。

4 .下载扫描工具scanner,3d物体的识别需要上传.od(object data file)文件到Vuforia官网。至于.od文件的生成,需要到官网下载名为vuforia object scanner的apk,然后安装到安卓手机上。(下载地址:https://developer.vuforia.com/downloads/tool

5 . 接着就是打开scanner,将物体放在网格中进行扫描。屏幕右上角的point数越多,依附在物体上的点数越密集时,识别率越高。扫描时,必须注意在室内环境下,且没有集中的强光照射,其实就是避免不必要的物体反光和照射下产生的阴影导致识别不准确。将所有网格都填满时,识别就可以结束。这一步需要比较多的耐心。。。(这里明显纸张的网格区域比小新的大小大很多,后面就会发现unity中展示的区域是整个网格大小,不止小新所包围的屏障的大小)

识别完后,可以通过app中的test按钮,将摄像头对准物体看看是否成功扫描并且容易被识别到。识别成功会出现一个半透明长方体。

6 . 最后一步,将软件生成的.od文件上传到官网(我是通过从手机分享到QQ上传到电脑的),然后下载package。具体操作是在target manager中,添加target,上传完成后(这个时间会比较久),下载Database,每个数据包(package)可支持多达20个的target。

Unity3d开发过程

在unity中我们需要用到关于vuforia的对象分别是ARcamera和ObjectTarget,分别来自Vuforia官方的Unity Sdk和上一部分的最后一步下载的关于识别物体的package。导入后可在assets里面找到这两个的prefab,拖进场景。另外记得要把unity默认的mainCamera删除。因为我们只需用到ARcamera。具体操作可看组内越升大神写的另一篇文章《有十块钱才玩得起的游戏》。

接下来介绍ARcamera和ObjectTarget的几个重要属性和参数:

1. ARcamera

  1. App License Key 需要填写你在官网申请的上面提到的license,否则不能运行。
  2. Camera Device Mode 设置程序中是渲染质量优先还是帧速率优先,默认MODE_DEFAULT在高性能设备下会优先渲染。
  3. Max Simultaneous Tracked Objects 定义最多有多少个targets可以同时通过摄像头跟踪。但对于3d物体识别的跟踪,最大的支持数为2.
  4. Camera Direction 定义摄像头下世界空间的原点,在摄像头移动时,坐标系为世界坐标系的其它object的position将会跟随这个原点移动。这里有四个选项:
    • SPECIFIC_TARGET 指定的target为世界空间的原点。
    • FIRST_TARGET 以摄像头第一个识别到的3d物体target的坐标为世界空间的原点。
    • CAMERA 世界坐标是以摄像头为准的,所以场景里的其它物体不会跟随识别target移动。
    • DEVICE_TRACKING 这个场景下经过测试,场景里的其它物体不会跟随识别target移动。暂时还不知道和第三种模式的区别是啥。。。

5 .World Center Mode 当Camera Direction设置为SPECIFIC_TARGET时,定义场景中指定的object作为场景的世界空间的原点。将该objectTarget拖进输入框即可。

6 .Load XXX Database&Active 勾选可以使得app在初始化时就自动加载需要识别的object的数据包并激活,如果不想要在app开始时就自动加载,则需要用到vuforia的API了,传送门 https://library.vuforia.com/articles/Solution/How-To-Load-and-Activate-Multiple-Device-Databases

2. ObjectTarget

1 . Database & Object Target 指定加载数据集和需要识别的target。

2 . length/width/height:包围被识别的target的长方体(Bound Box)的尺寸。

3 . Show Bound Box 勾选的话显示包围被识别的target的长方体(Bound Box)。

4 . Preserve child size 默认不勾选时,程序会根据被识别target的大小(摄像头到target的距离)自动调整附在识别target上的子物体的大小,与target保持比例,如果勾选则会一直保持子物体的大小。

5 . Enable Extended Tracking 当target离开摄像头但是附在target上的子物体还在时可以继续被跟踪到。看下图就明白了:

6 . Enable Smart Terrain Smart Terrain是vuforia的增强现实的一个重要功能,让识别target所在的物理环境可以得以重构和增强,对于它的使用,官网有详细的介绍和例子,但不能与Enable Extended Tracking同时被勾选。有兴趣的可以看看这个视频 点击观看

当了解了以上参数的作用后,就可以结合自己的需求进行开发了,在开发过程中,可能有以下两点需要注意:

1 .为识别物体ObjectTarget添加Object

为ObjectTarget添加可以跟随它移动的Object对象其实很简单,只需为ObjectTarget添加子物体,子物体的位置和大小也是以bounding box的原点坐标为准的。例如下图要为小新公仔加两个球,两个球体在摄像头上会跟随小新移动。

但是这个球体离小新的距离太远了,如果想要在小新公仔的两个手掌上加上两个小球体作为动感光波,必须要把小球定位到小新的两个手掌周围,但是我们可以参考的只有bounding box。

为了实现精准定位,首先要找到bounding box。因为game的场景下不会显示bounding box,所以我在scene下建立了一个跟bounding box位置和大小相同的半透明的cube,在game下显示情况如下图所示:

然后就会发现,bounding box的大小其实是识别图右上角的网格大小(所以前面才说要打印和识别物体大小差不多的识别图)。

这个时候,就可以不断调整球体的位置和大小直到360旋转的情况下都贴合小新的手掌,bounding box的三个边缘线分别是x\y\z轴,所以有了bounding box的显示还是比较容易找的。然后记录球体的位置和大小.

再切换到scene场景中,将记录下的位置和大小填入。(之前以为会有更好的方法,找了好久没找到,后面发现官网介绍也是这样子做的。。。)

这是最后在安卓手机摄像头下的展示效果,实在不知道会发光的动感光波在unity下要怎么实现,原谅我是建模渣渣,最后变成了小新的手掌出来了两颗会发光的小球体。

2 . 还有一点,vuforia中的ARcamera是没有默认自动对焦的,需要自己在script中设置。在ARcamera对应的脚本中加上以下这句(可能要针对不同设备兼容,但是在三星s6 edge测试是没问题的):


Vuforia.CameraDevice.Instance.SetFocusMode(Vuforia.CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);

参考文章地址:

【1】https://library.vuforia.com/articles/training/object-recognition

【2】https://library.vuforia.com/articles/Solution/How-To-Align-Digital-Content-on-an-Object

【3】https://library.vuforia.com/articles/Training/Vuforia-Object-Recognition-Unity-Sample-GuideGuide

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小巫技术博客

A008-drawable资源

关于drawable资源笔者之前有写过两篇文章: Android-自定义图像资源的使用(1) Android-自定义图像资源的使用(2) 这里笔者就不做过多的赘...

672
来自专栏安全领域

在物联网中应用机器学习:使用 Android Things 与 TensorFlow

在本教程中,我们将探索如何使用 Android Things 和 TensorFlow 将机器学习应用到物联网中。

69715
来自专栏深度学习计算机视觉

pytorch demo 实践

相关环境 python opencv pytorch ubuntu 14.04 pytorch 基本内容 60分钟快速入门,参考:https://blog...

5346
来自专栏磐创AI技术团队的专栏

数据可视化详解+代码演练

1344
来自专栏IT派

用Python画中国地图(下)

在上一篇文章《用Python画一个中国地图》中,我们简单描述了一下如何用Python快速画出一个中国地图的轮廓,似乎没有什么实用价值,这一次我们用实际数据填充它...

873
来自专栏数据小魔方

用R-Shiny打造一个美美的在线App

最近迷上了动态可视化,突然发现shiny真是个好东西,能够将我之前所学都完美的结合在一起,形成一个集成的动态仪表盘! 今天做一个小小的案例,算是shiny动态可...

3036
来自专栏MixLab科技+设计实验室

人工智能Logo设计师Brandmark

封面由ARKie智能设计赞助 早在去年 mixlab 的一篇案例报告里,就介绍过 Brandmark 了,当时 Brandmark 还是 v1 的版本,现在已...

2943
来自专栏腾讯移动品质中心TMQ的专栏

测试建模 :从尔康的鼻孔说开来,重要的用例写三遍

看完本文你会了解以下内容 1. 什么是SUT模型 2. 测试建模在工作中究竟是怎样一个过程 3. 从业务流程到测试用例我们忽略了什么 4. 测试建模会有哪些产出...

1785
来自专栏Petrichor的专栏

显示器 设置选项 解析

531
来自专栏ATYUN订阅号

使用Unity3D和TensorFlow教AI投篮

在本文中,我们将深入探讨如何使用Unity3D和TensorFlow来教AI执行简单的游戏任务:投篮。完整的源代码可以在文末访问Github链接。

1023

扫码关注云+社区