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 |
|
|||
Interfejs API Full Depth |
|
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;
}