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

Interfejs Raw Depth API dostarcza dane głębi obrazu z aparatu, które mają większą dokładność niż dane interfejsu Depth API, ale nie zawsze obejmują każdy piksel. Nieprzetworzone obrazy głębi wraz z ich pasującymi obrazami ufności również mogą być dalej przetwarzane, dzięki czemu aplikacje mogą korzystać tylko z tych danych, które są wystarczająco dokładne w danym przypadku użycia.

Zgodność urządzeń

Depth (Nieprzetworzona głębia) jest dostępna na wszystkich urządzeniach, które obsługują interfejs Depth API. Interfejs Raw Depth API, podobnie jak pełny interfejs Depth API, nie wymaga obsługiwanego sprzętowego czujnika głębokości, takiego jak czujnik czasu lotu (ToF). Jednak zarówno interfejs Raw Depth API, jak i full Depth API wykorzystują wszystkie obsługiwane czujniki sprzętowe, które może mieć urządzenie.

Interfejs Raw Depth API a pełną głębię interfejsu API

Interfejs Raw Depth API pozwala uzyskać bardziej dokładne oszacowania głębi, ale nieprzetworzona głębia obrazu może nie uwzględniać wszystkich pikseli na zdjęciu aparatu. W przeciwieństwie do tego pełny interfejs API Depth podaje szacunkową głębię dla każdego piksela, ale dane na piksel mogą być mniej dokładne z powodu wygładzania i interpolacji szacunkowych wartości głębi. Format i rozmiar obrazów głębi są takie same w obu interfejsach API. Różni się tylko ich treść.

W tabeli poniżej przedstawiono różnice między interfejsem Raw Depth API a pełnym interfejsem Depth API na podstawie zdjęcia krzesła i stołu w kuchni.

Interfejs API Zwroty Zdjęcie z aparatu Obraz z głębią Obraz ufności
Interfejs API Raw Depth
  • Obraz z nieprzetworzoną głębią, który zawiera bardzo dokładne oszacowanie głębi w przypadku niektórych pikseli w obrazie.
  • Obraz ufności, który daje pewność dla każdego piksela obrazu z nieprzetworzonej głębi. Poziom ufności pikseli zdjęć z aparatu bez oszacowania głębi wynosi 0.
Interfejs API pełnej głębi
  • Singiel „wygładzone” obraz głębi z szacowaną głębią dla każdego piksela.
  • Ten interfejs API nie zawiera obrazu pewności.
Nie dotyczy

Obrazy ufności

W przypadku obrazów z poziomem ufności zwracanych przez interfejs Raw Depth API jaśniejsze piksele mają wyższe wartości ufności, przy czym białe piksele oznaczają pełny poziom ufności, a czarne – brak pewności. Ogólnie obszary na zdjęciu z kamery, które mają większą teksturę, takie jak drzewo, mają większą głębię pewności niż te, w których nie ma takiej głębi, takie jak pusta ściana. W przypadku powierzchni bez tekstury stopień ufności wynosi 0.

Jeśli urządzenie docelowe ma obsługiwany sprzętowy czujnik głębi, stopień pewności w obszarach obrazu znajdujących się wystarczająco blisko aparatu jest prawdopodobnie wyższy, nawet na powierzchniach bez tekstur.

Koszt mocy obliczeniowej

Koszt mocy obliczeniowej interfejsu Raw Depth API to około połowy kosztu mocy obliczeniowej pełnego interfejsu Depth API.

Przypadki użycia

Interfejs Raw Depth API umożliwia uzyskiwanie obrazów głębi, które zapewniają bardziej szczegółową reprezentację geometrii obiektów na scenie. Nieprzetworzone dane o głębi mogą być przydatne podczas tworzenia obiektów AR, w których do rozumienia geometrii potrzebna jest większa dokładność i więcej szczegółów. Oto niektóre przypadki użycia:

  • Rekonstrukcja 3D
  • Pomiary
  • Wykrywanie kształtu

Wymagania wstępne

Upewnij się, że znasz podstawowe pojęcia związane z AR. i dowiedz się, jak skonfigurować sesję ARCore, zanim przejdziesz dalej.

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ą Depth API ze względu na ograniczenia mocy obliczeniowej. Aby można było oszczędzać zasoby, głębokość 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.
}

Uzyskaj najnowszy obraz z nieprzetworzoną głębią

Wywołaj AROcclusionManager.TryAcquireEnvironmentDepthCpuImage() i użyj AROcclusionManager.environmentDepthTemporalSmoothingRequested, aby uzyskać najnowszy obraz z nieprzetworzoną głębią procesora.

Uzyskaj najnowszy obraz ufności o pełnej głębi

Wywołaj metodę AROcclusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage() i użyj narzędzia 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;
}