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

Interfejs Raw Depth API udostępnia dane głębi dla obrazu z kamery, które mają większą dokładność niż dane z interfejsu Depth API, ale nie zawsze obejmują każdy piksel. Obrazy głębi w postaci surowych danych wraz z odpowiednimi obrazami z poziomami wiarygodności można też dalej przetwarzać, co pozwala aplikacjom używać tylko danych o głębi, które mają wystarczającą dokładność do danego przypadku użycia.

Zgodność urządzeń

Dane Depth w postaci surowych wartości są dostępne na wszystkich urządzeniach obsługujących interfejs Depth API. Interfejs Raw Depth API, podobnie jak pełny interfejs Depth API, nie wymaga obsługiwanego czujnika głębi sprzętowej, takiego jak czujnik ToF. Zarówno interfejs Raw Depth API, jak i pełny interfejs Depth API korzystają jednak z dowolnych obsługiwanych czujników sprzętowych, które może mieć urządzenie.

Interfejs Raw Depth API a pełny interfejs Depth API

Interfejs Raw Depth API zapewnia szacunki głębi o wyższej dokładności, ale obrazy głębi w formacie RAW mogą nie zawierać szacunków głębi dla wszystkich pikseli obrazu z kamery. W przeciwieństwie do tego pełny interfejs Depth API udostępnia szacowaną głębię dla każdego piksela, ale dane o głębi poszczególnych pikseli mogą być mniej dokładne ze względu na wygładzanie i interpolację szacunków głębi. Format i rozmiar obrazów głębi są takie same w obu interfejsach API. Różnią się tylko treści.

Tabela poniżej przedstawia różnice między interfejsem Raw Depth API a pełnym interfejsem Depth API na przykładzie obrazu krzesła i stołu w kuchni.

Interfejs API Zwroty Obraz z kamery Obraz głębi Obraz z poziomem ufności
Raw Depth API
  • obraz głębi w formacie RAW, który zawiera bardzo dokładne oszacowanie głębi dla niektórych, ale nie wszystkich pikseli obrazu z kamery;
  • obraz z poziomem ufności, który określa wiarygodność każdego piksela w surowym obrazie głębi; Piksele obrazu z kamery, które nie mają szacowanej głębi, mają wiarygodność 0.
Full Depth API
  • Pojedynczy „wygładzony” obraz głębi, który zawiera szacowaną głębię dla każdego piksela.
  • W ramach tego interfejsu API nie jest udostępniany obraz pewności.
Nie dotyczy

Obrazy z poziomem zaufania

W obrazach z poziomem pewności zwróconych przez interfejs Raw Depth API jaśniejsze piksele mają większą wartość pewności. Białe piksele oznaczają pewność, a czarne brak pewności. Ogólnie rzecz biorąc, obszary obrazu z kamery, które mają więcej tekstur, np. drzewo, będą miały większą pewność głębi niż obszary, które jej nie mają, np. pusta ściana. Powierzchnie bez tekstury zwykle mają wskaźnik pewności równy 0.

Jeśli urządzenie docelowe ma obsługiwany czujnik głębi, pewność co do obszarów obrazu znajdujących się w pobliżu aparatu będzie prawdopodobnie większa, nawet na powierzchniach bez tekstury.

Koszt mocy obliczeniowej

Koszt przetwarzania interfejsu Raw Depth API wynosi około połowy kosztu przetwarzania pełnego interfejsu Depth API.

Przypadki użycia

Dzięki interfejsowi Raw Depth API możesz uzyskać obrazy głębi, które zapewniają bardziej szczegółowe odwzorowanie geometrii obiektów w scenie. Dane głębi w postaci surowych danych mogą być przydatne podczas tworzenia doświadczeń AR, w których przypadku do zadań związanych z rozpoznawaniem geometrii potrzebna jest większa dokładność i szczegółowość głębi. Przykładowe zastosowania:

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

Wymagania wstępne

Zanim przejdziesz dalej, upewnij się, że rozumiesz podstawowe zagadnienia związane z rozszerzoną rzeczywistością oraz że wiesz, jak skonfigurować sesję ARCore.

Włączanie opcji Głębia

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, ARCore domyślnie wyłącza głębię. Włącz tryb głębi, aby aplikacja mogła korzystać z 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.
}

Pobieranie najnowszego obrazu głębi w formacie RAW

Wywołaj funkcję AROcclusionManager.TryAcquireEnvironmentDepthCpuImage() i użyj opcji AROcclusionManager.environmentDepthTemporalSmoothingRequested, aby uzyskać najnowszy obraz głębi w formacie RAW na procesorze.

Pobierz najnowszy obraz głębi w postaci surowych danych o pewności

Wywołaj funkcję AROcclusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage() i użyj parametru AROcclusionManager.environmentDepthTemporalSmoothingRequested, aby uzyskać obraz zaufania w procesorze.

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