Używanie nieprzetworzonej głębi w aplikacji AR Foundation na Androida

Interfejs Raw Depth API dostarcza dane o głębi zdjęcia z aparatu, które ma większą dokładność niż pełne dane Depth API, ale nie zawsze obejmuje każdy piksel. Nieprzetworzone obrazy głębi wraz z pasującymi do nich obrazami ufności mogą być dalej przetwarzane. Dzięki temu aplikacje mogą korzystać tylko z danych szczegółowych, które są dostosowane do danego przypadku użycia.

Zgodność urządzeń

Nieprzetworzona głębokość jest dostępna na wszystkich urządzeniach obsługujących Depth API. Interfejs Raw Depth API, podobnie jak Full Depth API, nie wymaga obsługiwanego sprzętowego czujnika głębokości, takiego jak czujnik czasu lotu. Zarówno interfejs Raw Depth API, jak i Full Depth API korzystają jednak z obsługiwanych czujników sprzętowych, które może posiadać urządzenie.

Porównanie interfejsu Raw Depth API z pełnym interfejsem Depth API

Interfejs Raw Depth API umożliwia szacowanie głębi z większą dokładnością, ale zdjęcia nieprzetworzone mogą nie zawierać szacunków dla wszystkich pikseli na zdjęciu z aparatu. Z kolei pełny interfejs Depth API podaje szacunkową głębię każdego piksela, ale dane dotyczące głębokości piksela mogą być mniej dokładne z powodu wygładzania i interpolacji szacowania głębi. Format i rozmiar obrazów głębi są takie same w obu interfejsach API. Różni się tylko treść.

W tabeli poniżej pokazujemy różnice między interfejsem Raw Depth API a pełnym interfejsem Depth API za pomocą zdjęcia krzesła i stół w kuchni.

API Akcje powrotne Zdjęcie z aparatu Obraz głębi Obraz pewności
Interfejs API Raw Depth
  • Nieprzetworzone zdjęcie z bardzo dokładnym oszacowaniem głębi dla niektórych (ale nie wszystkich) pikseli na zdjęciu.
  • Obraz pewności, który daje pewność przy każdym pikselu obrazu z nieprzetworzoną głębią. Piksele obrazu z aparatu, dla których nie określono szacowanej głębi, mają pewność o wartości 0.
Interfejs API Full Depth
  • Pojedyncze zdjęcie „wygładzone” z oszacowaną głębią dla każdego piksela.
  • Ten interfejs API nie dostarcza obrazu pewności.
Nie dotyczy

Obrazy potwierdzające pewność

Obrazy z nakładem ufności zwracane przez interfejs Raw Depth API – jaśniejsze piksele mają wyższe wartości ufności, przy czym białe piksele reprezentują pełną pewność, a czarne – brak pewności. Ogólnie obszary na zdjęciu z aparatu, które mają więcej tekstury, takie jak drzewo, mają większą pewność nieprzetworzonej głębi niż obszary, które tego nie robią, np. pusta ściana. Powierzchnie bez tekstury mają zwykle wartość zero.

Jeśli urządzenie docelowe ma obsługiwany sprzętowy czujnik głębokości, poziom ufności w obszarach wystarczająco blisko aparatu będzie prawdopodobnie wyższy, nawet na powierzchniach bez tekstur.

Koszt mocy obliczeniowej

Koszt mocy obliczeniowej interfejsu Raw Depth API to około połowy kosztów mocy obliczeniowej interfejsu Depth API.

Przypadki użycia

Za pomocą interfejsu Raw Depth API możesz uzyskiwać obrazy głębi, które dokładniej przedstawiają geometrię obiektów prezentowanych na scenie. Nieprzetworzone dane o głębi mogą być przydatne podczas tworzenia doświadczeń AR, w których zadania polegające na zrozumieniu geometrii wymagają większej dokładności i szczegółów szczegółowości. Przykłady użycia:

  • Rekonstrukcja 3D
  • Pomiary
  • Wykrywanie kształtów

Wymagania wstępne

Zanim przejdziesz dalej, upewnij się, że znasz podstawowe pojęcia związane z AR i wiesz, jak skonfigurować sesję ARCore.

Włącz głębię

W nowej sesji ARCore sprawdź, czy urządzenie użytkownika obsługuje Depth. Z powodu ograniczeń mocy obliczeniowej nie wszystkie urządzenia zgodne z ARCore obsługują interfejs Depth API. Aby oszczędzać zasoby, głębia jest domyślnie wyłączona w ARCore. Włącz tryb głębi, aby aplikacja używała interfejsu 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.
}

Pobierz najnowsze zdjęcie nieprzetworzone

Wywołaj AROcclusionManager.TryAcquireEnvironmentDepthCpuImage() i użyj AROcclusionManager.environmentDepthTemporalSmoothingRequested, aby pobrać najnowszy nieprzetworzony obraz głębi na procesor.

Uzyskaj najnowszy obraz ufności nieprzetworzonej głębi

Wywołaj AROcclusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage() i użyj AROcclusionManager.environmentDepthTemporalSmoothingRequested, aby uzyskać obraz ufności procesora.

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