RAW Depth API 为相机图像提供深度数据,该图像的准确性高于完整 Depth API 数据,但并非总是能够覆盖所有像素。还可以进一步处理原始深度图像及其匹配的置信度图像,以便应用仅针对其具体用例使用具有足够准确度的深度数据。
设备兼容性
原始深度适用于所有支持 Depth API 的设备。与完整 Depth API 一样,Raw Depth API 不需要支持的硬件深度传感器,例如飞行时间 (ToF) 传感器。不过,Raw Depth API 和完整 Depth API 都会使用设备可能具有的任何受支持的硬件传感器。
Raw Depth API 与 Full Depth API
Raw Depth API 可提供准确度较高的深度估值,但原始深度图像可能不包含相机图像中所有像素的深度估算值。相比之下,完整的 Depth API 可以为每个像素提供估计深度,但由于深度估计的平滑和插值,每像素的深度数据可能不太准确。这两个 API 中的深度图像的格式和大小相同。只是内容有所不同。
下表使用厨房里椅子和桌子的图片说明了 Raw Depth API 和完整 Depth API 之间的区别。
API | 返回 | 相机图片 | 深度图片 | 置信度图片 |
---|---|---|---|---|
Raw Depth API |
|
|||
全深度 API |
|
不适用 |
置信度图片
在 Raw Depth API 返回的置信度图像中,较浅的像素具有较高的置信度值,其中白色像素表示完全置信度,黑色像素表示无置信度。一般来说,在相机图像中,具有较多纹理的区域(例如树木)比没有纹理的区域(例如空白墙壁)具有更高的原始深度置信度。没有纹理的表面通常产生的置信度为零。
如果目标设备具有受支持的硬件深度传感器,那么即使在无纹理表面上,图像区域足够靠近相机的区域的置信度也可能会较高。
计算费用
Raw Depth API 的计算费用约为完整 Depth API 计算费用的一半。
用例
借助 Raw Depth API,您可以获取深度图像,从而更详细地表示场景中对象的几何形状。在打造 AR 体验时,原始深度数据可能很有用,因为在几何理解任务中,需要提高深度准确性和细节。一些用例包括:
- 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;
}