动感光波发射!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 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

你们都用 Python 做人脸识别,我就偏要用 Go!

做人脸识别用 Python 比较多,但是今天碰上一个另类,他就跟别人不一样,就不用 Python 用 Go。其实不管是 P 还是 G,能认出脸来就是好样的。

792
来自专栏AI研习社

谷歌发布 TensorFlow 1.5,全面支持动态图机制和 TensorFlow Lite

AI 研习社消息,日前,谷歌发布 TensorFlow 1.5,TensorFlow 又一次迎来更新。 在此前的版本中,TensorFlow 迎来三大重大变化:...

2834
来自专栏大数据文摘

手把手:我的深度学习模型训练好了,然后要做啥?

2222
来自专栏极客慕白的成长之路

通俗理解数据库范式

数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率、优雅的数据库。甚至设计出错误的数据库。而想要理解并掌握范式却并不是那么容易。教科...

592
来自专栏机器之心

开源 | 基于Metal的机器学习框架Bender:可在iOS上运行TensorFlow模型

选自GitHub 机器之心编译 参与:吴攀 在正在举行的 WWDC 2017 上,苹果宣布发布了 Metal 2,详情可参阅机器之心的报道《苹果开发者大会 W...

3399
来自专栏贾志刚-OpenCV学堂

手撕OpenCV源码之filter2D(一)

在上篇的GaussianBlur中提到,gaussianBlur使用的是filter2D的实现,因此上篇仅仅描述了高斯滤波器的生成细节,并没有针对滤波的计算细节...

1341
来自专栏数据科学与人工智能

【陆勤践行】Python和数据科学的起步指南

Python拥有着极其丰富且稳定的数据科学工具环境。遗憾的是,对不了解的人来说这个环境犹如丛林一般(cue snake joke)。在这篇文章中,我会一步一步指...

22510
来自专栏数据小魔方

精美炫酷数据分析地图——简单几步轻松学会

本篇文章开始教大家如何使用矢量素材在Excel、PPT中自定义精美的数据分析图表。 使用矢量素材制作数据分析报告其实并不难,最常见的就是形式就是使用矢量地图制作...

3515
来自专栏WindCoder

20种常用的 Ps技术

一种简单的数码照片后期润饰 1 打开图片,执行色像/饱和度(-40)降低饱和度。 2 新建一图层,将图层模式改为柔光,用画笔工具将需要润饰的部分画几下,这里...

491
来自专栏AI科技大本营的专栏

这一次,我拒绝了Python,选择了Go

最近,我用一个以 Go 语言为后端的软件,实现了一个人脸识别项目。它能够识别出上传照片中的人像 (如流行歌手)是谁。这听起来不错,我决定试一下也给你们介绍一下项...

1094

扫码关注云+社区