AR Foundation Android アプリで Raw Depth を使用する

Raw Depth API は、フル Depth API データよりも精度が高いカメラ画像の深度データを提供しますが、必ずしもすべてのピクセルをカバーしているわけではありません。元の奥行き画像を照合する信頼度画像とともにさらに処理できるため、アプリは個々のユースケースに対して十分な精度がある奥行きデータのみを使用できます。

デバイスの互換性

Raw Depth は、Depth API をサポートするすべてのデバイスで利用できます。Raw Depth API は、完全な Depth API と同様に、Time-of-Flight(ToF)センサーなど、サポートされているハードウェア深度センサーを必要としません。ただし、Raw Depth API と完全な Depth API はどちらも、デバイスでサポートされている任意のハードウェア センサーを利用します。

Raw Depth API と Full Depth API の比較

Raw Depth API を使用すると、より正確に奥行きを推定できます。ただし、未加工の奥行きの画像には、カメラ画像内のすべてのピクセルの奥行きの推定が含まれない場合があります。これに対して、完全な Depth API はピクセルごとに推定深度を提供しますが、ピクセルごとの深度データは、深度推定値の平滑化と補間によって精度が低くなる場合があります。奥行きのある画像の形式とサイズは両方の API で同じです。異なるのはコンテンツだけです。

次の表は、Raw Depth API と Full Depth API の違いを、キッチンの椅子とテーブルの画像を使用して示したものです。

API 戻り値 カメラ画像 奥行きのある画像 信頼度の画像
Raw Depth API
  • カメラ画像内のすべてのピクセルではなく、一部のピクセルの非常に正確な深度推定値を含む未加工の深度画像。
  • すべての奥行きの未加工画像ピクセルごとに信頼度を与える信頼度の画像。深度を推定できないカメラ画像のピクセルの信頼度は 0 です。
Full Depth API
  • 各ピクセルの奥行きの推定値を含む、単一の「平滑化された」奥行き画像。
  • この API では信頼度の画像は提供されません。
該当しない

信頼度の画像

Raw Depth API から返される信頼度の画像では、明るいピクセルほど信頼値が高く、白いピクセルは完全な信頼度を表し、黒いピクセルは信頼度が低いことを示します。一般に、カメラ画像で木のようにテクスチャの多い領域は、何もない領域(何もない壁など)よりも生の奥行きの信頼度が高くなります。通常、テクスチャのないサーフェスの信頼度は 0 になります。

対象デバイスがサポートされているハードウェア深度センサーを搭載している場合は、テクスチャのない表面であっても、カメラに十分近い画像領域の信頼度が高くなります。

コンピューティングの費用

Raw Depth API のコンピューティング費用は、完全な Depth API のコンピューティング費用の約半分です。

ユースケース

Raw Depth API を使用すると、シーン内のオブジェクトのジオメトリをより詳細に表現した深度画像を取得できます。未加工の深度データは、ジオメトリを理解するタスクに深度の精度とディテールの向上が求められる AR エクスペリエンスを作成する際に有用です。次のような用途があります。

  • 3D 再構築
  • 測定
  • 形状検出

前提条件

続行する前に、AR の基本的なコンセプトARCore セッションを構成する方法を理解しておいてください。

Depth を有効にする

新しい ARCore セッションで、ユーザーのデバイスが Depth に対応しているかどうかを確認します。処理能力の制約により、すべての 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;
}