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

Interfejs Raw Depth API udostępnia dane dotyczące głębi obrazu w kamerze, które mają większą dokładność niż pełne dane interfejsu API Depth, ale nie zawsze uwzględniają wszystkie piksele. Nieprzetworzone obrazy głębi oraz obrazy dopasowania o wysokim stopniu ufności mogą być nadal przetwarzane, co pozwala aplikacjom na korzystanie wyłącznie z danych o głębi, które są dopasowane do danego przypadku użycia.

Zgodność urządzenia

Ta funkcja jest dostępna na wszystkich urządzeniach obsługujących ten interfejs. Interfejs Raw Depth API, tak jak pełny interfejs API Depth, nie wymaga obsługiwanego czujnika głębokości sprzętu, np. czujnika czasu wyświetlania (ToF). Jednak zarówno nieprzetworzony interfejs API Raw Depth, jak i pełna wersja interfejsu API korzystają ze wszystkich obsługiwanych czujników sprzętowych na urządzeniu.

Interfejs API Raw Depth vs. Full Depth API

Interfejs Raw Depth API podaje prognozy dotyczące głębokości z większą dokładnością, ale obrazy surowej głębi mogą nie uwzględniać wartości szacunkowych dla wszystkich pikseli na obrazie z kamery. Pełna głębokość interfejsu API zapewnia natomiast szacunkową głębokość każdego piksela, ale dane dotyczące głębokości na każdy piksel mogą być mniej dokładne ze względu na wygładzanie i interpolację szacunkowych głębokości. Format i rozmiar obrazów głębi są takie same w obu interfejsach API. Różni się tylko treść.

W tabeli poniżej przedstawiono różnice między interfejsem Raw Depth API i pełnym interfejsem API, wykorzystując zdjęcie krzesła i stołu w kuchni.

API Zwraca Obraz z aparatu Obraz głębiowy Obraz pewności
Interfejs Raw Depth API
  • Nieprzetworzony obraz z dokładnością do głębokości tylko w przypadku niektórych pikseli obrazu (a nie wszystkie).
  • Pewny siebie obraz, który daje pewność dla każdego piksela obrazu nieprzetworzonego. Piksele zdjęć, które nie mają szacowanej głębokości, mają zerową wartość.
Full Depth API
  • Pojedynczy „wygładzony” obraz zawierający szacunkową głębokość każdego piksela.
  • Ten interfejs API nie dostarcza obrazu zaufania.
Nie dotyczy

Obrazy z poufnością

W przypadku obrazów ufności zwracanych przez interfejs Raw Depth API lżejsze piksele mają wyższe wartości pewności, białe piksele oznaczają pełny poziom ufności, a czarne piksele nie mają ufności. Ogólnie informacje o regionach na zdjęciu aparatu, które mają większą teksturę (np. drzewo), mają większą głębokość surową niż regiony, które go nie mają (np. pusta ściana). W przypadku powierzchni bez tekstur ich ufność wynosi zwykle zero.

Jeśli urządzenie docelowe ma obsługiwany sprzętowy czujnik głębokości, pewne obszary obrazu wystarczająco blisko aparatu będą prawdopodobnie wyższe, nawet na powierzchni bez tekstury.

Koszt mocy obliczeniowej

Koszt mocy obliczeniowej interfejsu Raw Depth API to około połowa kosztów obliczeniowych pełnej wersji tego interfejsu.

Przypadki użycia

Za pomocą interfejsu Raw Depth API możesz uzyskać obrazy głębi, które lepiej prezentują geometrię obiektów w scenie. Nieprzetworzone dane o głębokości mogą być przydatne podczas tworzenia doświadczeń w rzeczywistości rozszerzonej, w przypadku zadań wymagających zrozumienia geometrii potrzeba większej dokładności i szczegółowości. Przykładowe zastosowania:

  • Rekonstrukcja 3D
  • Pomiar
  • Wykrywanie kształtu

Wymagania wstępne

Zanim przejdziesz dalej, przeczytaj podstawowe zagadnienia dotyczące AR i skonfiguruj sesję ARCore.

Włącz głębię

W nowej sesji ARCore sprawdź, czy urządzenie użytkownika obsługuje Depth. Nie wszystkie urządzenia zgodne z ARCore obsługują interfejs Depth API ze względu na ograniczenia mocy obliczeniowej. Aby oszczędzać zasoby, głębokość w ARCore jest domyślnie wyłączona. 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 najnowszy obraz w formacie surowej głębi

Wywołaj AROcclusionManager.TryAcquireEnvironmentDepthCpuImage() i użyj metody AROcclusionManager.environmentDepthTemporalSmoothingRequested, aby uzyskać na swoim procesora najnowszy obraz nieprzetworzonych danych.

Uzyskiwanie najnowszego obrazu niepewnej głębokości

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