VR陀螺11月23日消息,在2020Google开发者大会最后一天,关于ARCore的深度API技术演讲如期举行。ARCore 1.18 中发布的深度 API,赋能数以亿计的 Android 设备,在只是使用一个 RGB 摄像头的情况下,生成深度图。本演讲介绍什么是深度 API,它如何工作,以及开发者如何可以利用它创造出有趣且真实的 ARCore 应用。
Google 技术布道师周克忠与Google 软件工程师Eric Turner以“使用深度 API 提升 AR 的真实性”为主题进行了演讲。演讲的前半部分,周克忠介绍了ARCore的最新功能,包括深度API是什么,它可以解决什么问题等;后半部分,Eric介绍了ARCore如何实现深度API。
一、深度API是什么?它可以解决什么问题?
之前Google大中华区ar/vr负责人熊子青也曾讲述,ARCore是Google为安卓平台制作的AR开发平台,目前在全球支持超过5亿台设备。其核心能力是运动追踪、环境理解和光估测。现在已经有很多APP使用ARCore制作出各种各样的丰富体验。
通过ARCore制作的应用看上去很逼真,但是实际体验上,这些虚拟内容看起来好像他们就是手机膜一样被贴到手机屏幕上,他们并不是真的在现实世界里面,这里缺少的就是遮挡,会破坏ARCore应用的真实感。
深度API的加入,可以解决虚拟对象缺乏真实感的问题,能够消除违和感。
二、如何实现遮挡?
首先我们需要定义深度。如图C点是摄像机的位置,Z轴是摄像机的主轴,A点表示一个现实的物体,从C到A的深度则被定义为线段CA在Z轴的投影。此为场景物体的深度轴。
根据深度信息,智能手机就能够渲染虚拟物体。在着色渲染器里面计算每一个像素点的时候,我们将当前像素点的深度值,和之前在这个像素点所渲染过的颜色的深度值进行对比。
如果之前的像素点深度值更低,那么就意味着它更近;相反,则更远。就这样便可以实现基于深度的遮挡效果。
三、除了遮挡,深度API增强真实感的其他方式
1.AR光标。在AR应用里面,用户可以把定点的光标贴合深度API生成的网格,此时光标就变成了在现实世界存在的AR光标。目的是更好地帮助用户理解现在所看到、所对准的具体位置,以及这个位置的形状。
2.物理交互。比如如图所示,将一个虚拟物体丢到健身自行车上面,让AR物体和真实世界的物体发生物理碰撞,进行物理模拟。
3.表面交互。通过让AR角色在识别真实物体表面的高低起伏,从而做出更加真实的前进路线,甚至可以绕开障碍物。
周克忠还介绍了目前团队发表的论文《Depth Lab:Real-time 3D Interaction with Depth Maps for Mobile Augmented Reality》(UIST,2020),论文主要关于如何从深度信息实现以上功能,以及深度信息可以开启怎样的应用场景。
四、如何实现复杂的用法?
团队利用了三种辅助数据结构来帮助计算。
第一种数据结构就是一个深度数组,可以在屏幕上进行局部坐标的深度信息查询。
第二种是深度网格,可以用来和真实物体的表面进行交互。注意这里是平面坐标系的网格,毕竟世界坐标系的网格运算量过大,一般手机无法承载。
第三种是深度贴图,对GPU能处理的每一个像素都提供对应的深度值。
这三种结构在Depth Lab(深度API应用程序)都有提供代码,是一个开源项目,提供给开发者进行自主设计。
五、关于局部、表面和密集深度贴图的方法
通过使用深度数组,用户可以查询局部的点的信息,以及这个点周围的局部区域的深度信息。
局部深度用法中,只用某些点的深度估测值,可以用于测量、3D资源的放置和碰撞检测。也可以配合多点的深度,实现简单的AR角色的障碍规避。比如说通过深度信息查询环境中一个点与另一个点的实际距离。
表面深度用法,是基于深度信息快速构建屏幕空间的网格模型,利用游戏引擎进行网格交互。表面深度算法让我们可以在3D网格上面实现光照、物理效果、阴影等功能。
密集深度用法,即通过在深度贴图上直接进行操作,以实现复杂的逐像素特效。由于深度贴图上的每个像素都有深度值,使得计算量特别大。一般的屏幕空间网格,其实是经过相当的简化后的网格,而ARCore把计算量移到了GPU上,减小了手机的计算负担。
第二部分里,在周克忠介绍深度API实际运作方式的基础上,Eric通过具体例子进行了补充。
六、深度API原理剖析
一般而言,手机需要配备特殊的深度硬件才能实现深度识别,比如ToF深度传感器,但实际上并不需要特殊设备,只需要有摄像头,就可以实现ARCore的深度API功能。
如图,左边是手机相机拍摄的原始图像,右边是深度API为此场景生成的深度。用户可以近距离观察单车,也可以远距离观察远处的门和走廊,分别对应的颜色是红色和蓝色,表示近处和远处。
这意味着无论AR应用在做什么,它都可以获取整个场景中的每个帧的深度信息。根据相机的运动生成深度信息,如蓝色帧为远处,红色帧为近处,这些帧会被最后的相机画面帧(黑色)引用为立体匹配关键帧。过去的帧与当前的帧之间的基线,可用来估算场景的立体深度。
但Eric提到,基于用户自然移动的规则,团队为此添加了一些限制。因此与传统的并行立体匹配相比,设计基于自然移动的深度API则存在一些挑战。
传统的并行立体匹配可以全面控制相机之间的相对位置。而在典型AR应用中,对于随机相机移动,团队无法控制相机的位置,即用户在进行自由移动时,相机可能在任何方向。
而目前,ARCore深度API添加了智能图像处理功能,以确保整个图像都具有准确的深度。除此之外,还能够补偿速度匹配错误、运动模糊、自动聚集聚焦变化或自然移动导致的小于正常基线的问题等。
深度API的完整流程是:
实时图像-形成关键帧池-筛选出关键帧-根据智能算法剔除无效关键帧-立体匹配-使关键帧平滑-调用深度API-实现渲染遮挡。
其亮点在于,即使是一面空白无特征的墙,ARCore的深度API仍然能够生成正确表示该空白墙的深度图像。
其原理是,如图所示,白墙是黄色帧,箱子是橙色帧。在图二的中间,可以看到伪色深度图像,正确呈现了场景中的物体的远近位置。而图三则是以点云代替颜色,进行了侧面视角观察,但同样能以垂直点表示墙面、水平点表示箱子,准确判断出墙和箱子的相对距离。
演讲的最后,周克忠总结,实现深度API最大的难点是怎么扩展这个能力。到数以亿计的安卓设备上设计深度API的时候,一方面我们需要尽可能的呃让它的结果准确精确,另外我们需要尽量去减少它的计算量,以尽量支持更多的已有设备。
而近年来,Google一直在进行深度API的优化,以减少它的计算量。
投稿/爆料:tougao@youxituoluo.com
稿件/商务合作: 六六(微信 13138755620)
加入行业交流群:六六(微信 13138755620)
元宇宙数字产业服务平台
下载「陀螺科技」APP,获取前沿深度元宇宙讯息