下载本教程工程文件(Github)

从我最早开始接触增强现实以来,有三种核心识别方式:

图像识别

可以通过图像在空间内布置虚拟物品

平面检测

可以转换任意墙面或地板成为虚拟世界的一部分

物体识别

从2017年Vuforia开始便具备这一功能,包括EasyAR也是很早具备此功能的,但由于其操作流程极其受限,我一直没有试着去尝试,直到ARKit在2019年给出了非常轻便的方法 ARReferenceObject,这篇教程记录基于此,有兴趣可以点击查阅官方文档。通过本教程,可以实现如下效果:

Unity ARFoundation 识别图片_目标检测

① 扫描真实物体,获得扫描参数设备要求

iPhone 6s或更新,系统iOS 12或更高;

iPad五代或更新,系统iOS 12或更高。

安装扫描App

下载官方提供的工程文件“ScanningAndDetecting3DObjects”,通过Xcode安装到设备中,详情可看官方文档;

在设备中,扫描App名称为:ARKit Scanner。

布置扫描环境

确保被扫描物体非透明、非高反射度(如镜面)、表面尽可能粗糙(更多识别点),最小长度不小于1厘米,最大长度不大于5米;

扫描环境处于自然光中最佳,确保被扫描物体光照均匀,如使用人造光则日光灯最佳(色温6500k);

被扫描物体以外,中性色且无反光。

开始扫描

1.打开ARKit Scanner,镜头对准被扫描物体,直至有点云和黄框立方体出现,点击“Next”进行框定;

Unity ARFoundation 识别图片_物体识别_02

2.双指在屏幕上移动或缩小黄框立方体,直至正好框住被扫描物体,点击“Scan”进行扫描;

Unity ARFoundation 识别图片_ar_03

3.绕着被扫描物体,直至“上左右前后”五个面都出现黄色透明面,并且在App的标题部分显示“100%”,黄框立方体将自动出现3轴坐标轴;

Unity ARFoundation 识别图片_unity_04

4.点击“Test”,将被扫描物体放置在不同环境中测试识别准确度(若光线不足,可点击“Light On”打开设备闪光灯);

Unity ARFoundation 识别图片_ar_05

5.若在第四步的识别准确度测试中效果不佳,可以点击左上角“Merge Scans>Merge New Scan”增加扫描数据;

Unity ARFoundation 识别图片_目标检测_06

6.点击“Test”,检查识别准确度是否提高,在本例中,可以看到识别点云大幅度增加了;

Unity ARFoundation 识别图片_App_07

7.点击“Share”导出识别数据文件arobject(请勿通过QQ、微信等通讯软件进行传输,文件将发生损坏)。

② 在Unity中搭建

1.确保布置好ARFoundation开发环境(基本操作,此处不详述);

2.将上一章节中创建的arobject拖入Assets中,其应该如下图显示,如果没有图片,说明文件损坏,原因上一章已说;

Unity ARFoundation 识别图片_物体识别_08

3.在Project中右键,Create>XR>ReferenceObjectLibrary,将arobject文件拖拽入Reference Object Assets,并输入Name;

Unity ARFoundation 识别图片_ar_09

4.在Inspector中,AR Session Origin>Add Component,添加AR Tracked Object Manager;

5.将ReferenceObjectLibrary拖拽入AR Tracked Object Manager>Reference Library中;

6.将识别模型(确保位置在0位置,尺寸已根据物体的真实大小做了调整,且已制成Prefab)拖拽入AR Tracked Object Manager>Tracked Object Prefab。

Unity ARFoundation 识别图片_App_10

③ 更进一步

在案例中,我只使用了视频作为识别对象,教程可看 AR transparent video playback in Unity 第三章。

关于物体识别,我更考虑在空间内的与空间发生关系的物品,如家具等,作为混合现实空间体验的标记物,这可能是物体识别最大的价值所在(当下,图像识别稳定度比物体识别稳定度高多了)。