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 poziomem pewności mogą być poddawane dalszemu przetwarzaniu, co pozwala aplikacjom na korzystanie tylko z danych o głębi, które mają wystarczającą dokładność do danego 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). 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
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 określa wiarygodność każdego piksela w surowym obrazie głębi. Piksele obrazu z kamery, które nie mają oszacowania 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 faktury.

Koszt mocy obliczeniowej

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

Przypadki użycia

Za pomocą interfejsu 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łą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 można było oszczędzać zasoby, głębokość jest domyślnie wyłączona w ARCore. 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.
}

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.

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