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

Raw Depth API は、Depth API データ全体よりも精度が高いカメラ画像の深度データを提供しますが、すべてのピクセルをカバーできるとは限りません。未加工の深度画像とそれに対応する信頼画像もさらに処理できます。これにより、個々のユースケースに十分な精度の深度データのみをアプリで使用できるようになります。

デバイスの互換性

Raw Depth は Depth API に対応しているすべてのデバイスで利用できます。Raw Depth API は、完全な 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
  • カメラの画像内の一部のピクセルについて、非常に正確な深度推定値を含む未加工の深度画像。
  • 未加工の深度画像ピクセルすべての信頼値を示す信頼画像。奥行きの推定値がないカメラ画像のピクセルの信頼度は 0 です。
Full Depth API
  • すべてのピクセルの深度推定値を含む単一の「平滑化」深度画像。
  • この API には信頼画像が提供されていません。
N/A

信頼画像

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

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

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

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

ユースケース

Raw Depth API を使用すると、シーン内のオブジェクトのジオメトリをより詳細に把握できる深度画像を取得できます。未加工の深度データは、ジオメトリ理解タスクで深度精度と詳細度を高める必要がある AR エクスペリエンスを作成する際に役立ちます。ユースケースには、次のようなものがあります。

  • 3D 再建
  • 測定
  • 図形検出

Prerequisites

先に進む前に、AR の基本コンセプトARCore セッションの構成方法を理解しておいてください。

奥行きを有効にする

新しい 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;
}