在 AR Foundation Android 应用中使用“原始深度”功能

Raw Depth API 可为相机图像提供深度数据,这些数据的准确性高于完整 Depth API 数据,但并不总是涵盖每个像素。原始深度图像及其匹配的置信度图像还可以进一步处理,以便应用仅使用对其具体用例而言准确性足够高的深度数据。

设备兼容性

所有支持 Depth API 的设备均支持原始深度。与完整 Depth API 一样,Raw Depth API 不需要受支持的硬件深度传感器,例如飞行时间 (ToF) 传感器。不过,Raw Depth API 和完整 Depth API 都会使用设备可能具有的任何受支持的硬件传感器。

原始深度 API 与完整深度 API

Raw Depth API 提供更高准确度的深度估算值,但原始深度图像可能不包含相机图像中所有像素的深度估算值。相比之下,完整的 Depth API 会为每个像素提供深度估算值,但由于深度估算值经过了平滑和插值处理,因此每个像素的深度数据可能不太准确。这两个 API 中的深度图像的格式和大小相同。只有内容不同。

下表使用厨房中椅子和桌子的图片说明了原始深度 API 与完整深度 API 之间的区别。

API 返回 相机图片 深度图像 “充满信心”图片
原始深度 API
  • 原始深度图像,其中包含对相机图像中部分(但不是全部)像素的非常准确的深度估算值。
  • 置信度图像,用于提供每个原始深度图像像素的置信度。没有深度估测的相机图像像素的置信度为零。
Full Depth API
  • 单个“平滑”深度图像,其中包含每个像素的深度估测值。
  • 此 API 不提供置信度图片。
不适用

信心图片

在 Raw Depth API 返回的置信度图片中,颜色越浅的像素具有越高的置信度值,其中白色像素表示完全置信,黑色像素表示无置信。一般来说,相机图片中纹理较多的区域(例如树木)的深度原始信任度会高于纹理较少的区域(例如空白墙面)。没有纹理的表面通常会产生 0 的置信度。

如果目标设备具有受支持的硬件深度传感器,则图片中距离摄像头足够近的区域的置信度可能会更高,即使在没有纹理的表面上也是如此。

计算费用

Raw Depth API 的计算开销约为完整 Depth API 的计算开销的一半。

使用场景

借助 Raw Depth API,您可以获取深度图片,以更详细地表示场景中对象的几何图形。在创建增强现实体验时,如果需要提高深度准确性和细节,以便执行几何图形理解任务,原始深度数据会很有用。一些用例包括:

  • 3D 重建
  • 效果衡量
  • 形状检测

前提条件

在继续操作之前,请确保您了解基本 AR 概念以及如何配置 ARCore 会话

启用深度

新的 ARCore 会话中,检查用户的设备是否支持深度。由于处理能力限制,并非所有 ARCore 兼容设备都支持 Depth API。为节省资源,深度在 ARCore 上默认处于停用状态。启用深度模式,以便您的应用使用 Depth API。

var occlusionManager = // Typically acquired from the Camera game object.

// Check whether the user's device supports the Depth API.
if (occlusionManager.descriptor?.supportsEnvironmentDepthImage)
{
    // If depth mode is available on the user's device, perform
    // the steps you want here.
}

获取最新的原始深度图像

调用 AROcclusionManager.TryAcquireEnvironmentDepthCpuImage() 并使用 AROcclusionManager.environmentDepthTemporalSmoothingRequested 在 CPU 上获取最新的原始深度图像。

获取最新的原始深度置信度图像

调用 AROcclusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage() 并使用 AROcclusionManager.environmentDepthTemporalSmoothingRequested 在 CPU 上获取置信度图像。

// Attempt to get the latest environment depth image.
if (occlusionManager && occlusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage(out XRCpuImage image))
{
    using (image)
    {
        UpdateRawImage(m_RawEnvironmentDepthConfidenceImage, image);
    }
}
else
{
    m_RawEnvironmentDepthConfidenceImage.enabled = false;
}