Google ARCore 1.18 近期发布重大更新,通过 Depth API(深度 API)解决了一直横亘在开发者面前的深度理解和遮挡难题。文末更有 7/18 技术直播分享活动,不要错过!
Depth API 仅凭设备的 RGB 摄像头就可以创建深度图。应用深度图提供的深度信息,虚拟物体能够准确地出现在现实物体的之前或之后,从而与现实场景真正融合,为用户打造更加逼真和有沉浸感的 AR 体验。
本文将从技术角度带你了解 Depth API 的算法和具体原理,并且手把手教你 Depth API 开发流程,让你的应用也能在深度理解上实现技术飞跃。
我们可以通过下面的例子来感受一下 Depth API 的能力:下面两张图是虚拟的 “安卓小人” 和真实的木箱的组合。左图中没有 Depth API,虚拟的 “安卓小人” 如贴纸般重叠在与木箱上层,画面露馅了。右图用了 Depth API,虚拟物体被真实物体合理遮挡,这样看起来才够真。
* 获取 Depth API 支持设备列表,请访问 ARCore 支持设备页面。
支持设备列表
https://developers.google.cn/ar/discover/supported-devices
深度图的动态算法
*Depth API 通过 depth-from-motion 算法(基于运动的深度算法)创建深度图。这张深度图你可以使用 acquireDepthImage() 获取,详情请访问 Acquire Depth Image。
Acquire Depth Image
https://developers.google.com/ar/reference/java/arcore/reference/com/google/ar/core/Frame#acquireDepthImage()
在用户移动手机的过程中,这个 depth-from-motion 算法记录多个从不同角度拍摄的图像,对比这些图像,从而估算出场景中每个像素的距离。如果设备还搭载 ToF 等主动深度传感器,那些数据会被自动融入计算出来的深度信息中。这样会提升现有深度图能力,这样即使不移动相机镜头,设备也能很好地理解“深度”。同时在一些缺少纹理的表面上,比如白墙,或者包含运动的人或物的动态场景里,搭载主动深度传感器(TOF)也解决了之前的“理解无能”问题。
下图左边展示了一幅静态场景,里面有辆自行车挂在走廊的墙壁,右边是基于当前的相机图片所创建的深度图的可视化表示。
深度图格式
* 每一张深度图都表示为 ArImage
ARCore 使用 Depth16 格式的深度图,其中最高三个位始终设置为 000.
深度图的每个像素值是由无符号 16 位整数表示,其中 13 个最低位表示从相机的图像平面,沿着相机的光轴,到估算表面的距离。该距离以毫米为单位。
对运动的要求
Depth API 需要使用 ARCore 的运动跟踪功能。如果设备有主动深度传感器也会一并使用。depth-from-motion 算法实际上会将一对相机图像作为静态场景的两次观测结果。如果这个环境中的某一部分移动了,例如有人在镜头前运动,那么该场景的静态部分将会有估算准确的深度值,但是运动的部分则不会。
对于没有搭载主动深度传感器的设备,想要让 Depth API 更好地工作,用户需要至少移动自己的设备几厘米。
确保深度值的准确估算
深度值的取值范围是 0 到 8 米。当被测物体距摄像镜头的距离在 0.5-5 米之间时能够获取最佳准确率的深度值。随着到摄像头距离的增加,误差会呈二次方增长。
如果没有主动深度传感器,Depth API 就只能通过 RGB 色彩信息来执行深度估算任务。但是像白墙这种少有纹理甚至没有纹理的表面将无法被关联到精准的深度值。
理解深度值
理解深度值,才能正确的使用它。那么深度值究竟表示什么意义呢?通过坐标的形式给大家解释一下吧。
在上述这个图片中,假设 A 是真实物体表面上的一点,通过光路投射到深度图上,所对应的点以 a 来表示。在深度图中,a 这一点的深度值与 CA 投影到主光轴(principal axis)的长度相同。这个值也可以被理解为A 在 Z 轴的坐标,在以相机位置 C 为原点的坐标系里。在使用 Depth API 时要注意,我们所要了解深度值不是线段 CA 本身的长度,而是其投影的长度。
下一步,启用 Depth API
了解了 Depth API 的强大,你是不是也迫不及待想要动手实践了呢?接下来我们将手把手教你如何为 Depth API 设置开发环境。尝试在示例应用中,使用遮挡功能并且可视化深度图。跟着小编一步步操作吧。
前期准备工作
使用 Android Studio 3.1 版本、 Android 7.0 (API level 24)或更高版本
支持 Depth API 的 Android 设备。具体请查阅支持设备列表
了解 Android 开发的基础原理。更多信息请参考初学者第一个应用开发指南
对 Depth API 有基础了解。如果你是第一次接触 Depth API, 需要读完上文。
支持设备列表
https://developers.google.cn/ar/discover/supported-devices
初学者第一个应用开发指南
https://developer.android.com/training/basics/firstapp
打开示例项目
本示例基于 OpenGL。OpenGL 是一个用于渲染 2D、3D 矢量图形的跨语言、跨平台 API。在开始以下步骤前,请再次回顾启用 ARCore 的相关内容。
启用 ARCore
https://developers.google.cn/ar/develop/java/enable-arcore
* 点击以下链接获取示例项目
git clone https://github.com/google-ar/arcore-android-sdk.git
在 Android Studio 集成开发环境中,点击 arcore-android-sdk 目录,选择 samples 列表,你就能找到 hello_ar_java 示例项目了。
运行示例项目
Depth API 示例应用可以将虚拟的 “安卓小人” 放置在真实的环境中,你可以开关 “遮挡” 功能,切换查看差异。
* 注意 :当你运行 Android Emulator 时,Depth API 将不能使用。若想检测你的设备是否能支持 Depth API, 请查阅支持设备列表。
请确保你的设备已连接到开发机器,并在 Android Studio 集成开发环境中点击 Run(运行)。
接下来,将你的设备勾选为部署目标,最后点击 OK 确定。
如果未安装 Google Play Survices for AR,或者应用版本过旧,系统会自动要求你进行安装或升级。点击 CONTINUE(继续) 从手机的默认应用商店中安装。
启用 Depth
在你首次运行应用或放置 “安卓小人” 时,屏幕上会弹出对话框,提示你启用 Depth。这个对话框只会在首次启用时弹出,点击 Enable (启用),就能实现遮挡功能了。
切换 “遮挡功能” ,展示可视化深度图
如下图所示,点击图中右上角的齿轮图标。屏幕中心会弹出一个对话框。你可以勾选 Enable depth (启用 Depth)、Show depth map(显示可视化深度图)来启用或停用相应功能。
以上就是 ARCore Depth API 技术的入门级课程。如果你对此技术感兴趣,并想深入学习进而应用到自己的 App 上,请持续关注 “谷歌开发者” 公众号,打开菜单开发技术-ARCore,我们将为你奉上 AR 技术相关的一系列新鲜资讯。
ARCore 技术直播分享来了!
本周末 7/18 日,将有一场 ARCore 技术的直播分享,由滴滴 AR 导航高级算法工程师为你深入解析 ARCore 的核心技术及开发应用的技巧,从产品架构、开发流程、用户体验等多方面,和你一起探讨开发 AR 应用的心得体会。
你不得不了解的 Flutter 与 ARCore
活动时间:7 月 18 日下午 15:00-15:40
直播链接:BiliBili 平台 https://live.bilibili.com/21170438
活动背景:本次活动为 GDG China Android 11 Meetups 系列活动中石家庄场次,其中 ARCore 部分 15:00 正式开始。
活动日程:
14:00-14:10
Android 11 Meetups 系列活动介绍及活动开场
14:10-14:50
腾讯如何使用 Flutter 快速构建 Android 应用
14:50-15:00
中场休息(现场抽奖)
15:00-15:40
Google ARCore 核心功能及滴滴 AR 导航实践经验
15:40-16:00
Q&A(线上 10 个问题+线下 5 个问题)
讲师介绍:
滕晓强
滴滴地图与公交事业部
高级算法工程师
国防科技大学博士,主要关注于视觉惯性里程计和步行导航方向技术研究。在滴滴 AR 导航产品中,负责导航算法和 Android 端系统研发,本次将会分享 Google ARCore 核心功能及滴滴 AR 导航实践经验。