AR Foundation Android 앱에서 Raw Depth 사용

Raw Depth API는 전체 Depth API 데이터보다 정확성이 높은 카메라 이미지의 깊이 데이터를 제공하지만 항상 모든 픽셀을 다루지는 않습니다. 원시 심도 이미지는 일치하는 신뢰도 이미지와 함께 추가로 처리할 수도 있으므로 앱은 개별 사용 사례에 충분한 정확성을 갖는 심도 데이터만 사용할 수 있습니다.

기기 호환성

Raw Depth는 Depth API를 지원하는 모든 기기에서 사용할 수 있습니다. Full Depth API와 마찬가지로 Raw Depth API에는 비행 시간 (ToF) 센서와 같은 지원되는 하드웨어 깊이 센서가 필요하지 않습니다. 그러나 Raw Depth API와 전체 Depth API 모두 기기에 있는 지원되는 하드웨어 센서를 사용합니다.

원시 Depth API와 전체 Depth API 비교

Raw Depth API는 더 높은 정확도로 깊이 추정치를 제공하지만 원시 깊이 이미지에는 카메라 이미지의 일부 픽셀에 대한 깊이 추정치가 포함되지 않을 수 있습니다. 반면, Full Depth API는 모든 픽셀에 대해 추정 심도를 제공하지만, 픽셀당 심도 데이터는 심도 추정치의 평활화 및 보간으로 인해 정확도가 떨어질 수 있습니다. 두 API에서 깊이 이미지의 형식과 크기는 동일합니다. 콘텐츠만 다릅니다.

다음 표는 주방에 있는 의자와 탁자의 이미지를 사용하여 Raw Depth API와 전체 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 세션 구성 방법을 이해해야 합니다.

깊이 사용 설정

새 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;
}