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

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

デバイスの互換性

未加工の深度は、Depth API をサポートするデバイスで利用できます。Raw Depth API は、完全な Depth API と同様に、Time of Flight(ToF)センサーなどのサポートされているハードウェア深度センサーを必要としません。ただし、Raw Depth API とフル Depth API の両方で、デバイスに搭載されているサポートされているハードウェア センサーが使用されます。

Raw Depth API とフル Depth API

Raw Depth API は、より正確な深度推定を提供しますが、RAW 深度画像には、カメラ画像のすべてのピクセルの深度推定が含まれていない場合があります。一方、Full Depth API はすべてのピクセルの推定深度を提供しますが、深度推定の平滑化と補間により、ピクセルごとの深度データの精度は低くなる可能性があります。深度画像の形式とサイズは、両方の API で同じです。内容が異なるだけです。

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

API 戻り値 カメラ画像 奥行き画像 信頼性の画像
Raw Depth API
  • カメラ画像の一部(ただしすべてのピクセルではない)の非常に正確な深度推定値を含む未処理の深度画像。
  • 未加工の深度画像の各ピクセルの信頼度を示す信頼度画像。奥行きの推定値がないカメラ画像ピクセルの信頼度はゼロです。
Full Depth API
  • 各ピクセルの深度推定値を含む単一の「スムーズ化」された深度画像。
  • この API には信頼性の高い画像は提供されていません。
該当なし

信頼性の画像

Raw Depth API から返される信頼画像では、明るいピクセルほど信頼値が高くなります。白色のピクセルは完全に信頼できるピクセル、黒色のピクセルは信頼できないピクセルを表します。一般に、カメラ画像内のテクスチャが多い領域(木など)では、テクスチャが少ない領域(壁など)よりも、未加工の深度信頼性が高くなります。テクスチャのないサーフェスは通常、信頼度がゼロになります。

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

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

Raw Depth API のコンピューティング コストは、フル Depth API のコンピューティング コストの約半分です。

ユースケース

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

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

前提条件

続行する前に、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;
}