Die Raw Depth API liefert Tiefendaten für ein Kamerabild, die eine höhere Genauigkeit als vollständige Depth API-Daten haben, deckt jedoch nicht immer jedes Pixel ab. Rohtiefenbilder und die zugehörigen Konfidenzbilder können auch weiter verarbeitet werden, sodass Apps nur die Tiefendaten verwenden können, die eine ausreichende Genauigkeit für ihren jeweiligen Anwendungsfall haben.
Eingeschränkte Gerätekompatibilität
„Raw Depth“ ist auf allen Geräten verfügbar, die die Depth API unterstützen. Wie die Full Depth API benötigt die Raw Depth API keinen unterstützten Hardware-Tiefensensor wie einen Time-of-Flight-Sensor. Sowohl die Raw Depth API als auch die vollständige Depth API verwenden jedoch alle unterstützten Hardwaresensoren eines Geräts.
Raw Depth API und Full Depth API im Vergleich
Die Raw Depth API ermöglicht Tiefenschätzungen mit höherer Genauigkeit, aber die Bilder für die Rohtiefe enthalten möglicherweise nicht für alle Pixel im Kamerabild Tiefenschätzungen. Im Gegensatz dazu liefert die Full Depth API die geschätzte Tiefe für jedes Pixel. Die Daten für die Tiefen pro Pixel sind jedoch möglicherweise aufgrund der Glättung und Interpolation der Tiefenschätzungen weniger genau. Das Format und die Größe der Tiefenbilder sind in beiden APIs gleich. Nur der Inhalt ist anders.
In der folgenden Tabelle werden die Unterschiede zwischen der Raw Depth API und der Full Depth API anhand des Bildes eines Stuhls und eines Tisches in einer Küche dargestellt.
API | Rückgaben | Kamerabild | Tiefenbild | Konfidenzbild |
---|---|---|---|---|
Raw Depth API |
|
|||
Full Depth API |
|
– |
Konfidenzbilder
In Konfidenzbildern, die von der Raw Depth API zurückgegeben werden, haben hellere Pixel höhere Konfidenzwerte, wobei weiße Pixel für die volle Konfidenz und schwarze Pixel für keine Konfidenz stehen. Im Allgemeinen weisen Bereiche im Kamerabild mit mehr Textur, z. B. ein Baum, ein höheres Konfidenzniveau für die Tiefentiefe auf als Regionen, in denen dies nicht der Fall ist, z. B. eine leere Wand. Oberflächen ohne Textur haben in der Regel einen Konfidenzwert von null.
Wenn das Zielgerät über einen unterstützten Hardware-Tiefensensor verfügt, ist die Konfidenz in Bereichen des Bildes, die nahe genug an der Kamera sind, wahrscheinlich höher, selbst auf texturlosen Oberflächen.
Compute-Kosten
Die Computing-Kosten der Raw Depth API betragen etwa die Hälfte der Computing-Kosten für die vollständige Depth API.
Anwendungsfälle
Mit der Raw Depth API können Sie Tiefenbilder abrufen, die eine detailliertere Darstellung der Geometrie der Objekte in der Szene bieten. Rohtiefendaten können bei der Erstellung von AR-Anwendungen nützlich sein, bei denen eine höhere Tiefengenauigkeit und mehr Details zum Verständnis der Geometrie erforderlich sind. Einige Anwendungsfälle:
- 3D-Rekonstruktion
- Messwerte ermitteln
- Formerkennung
Voraussetzungen
Machen Sie sich mit den grundlegenden AR-Konzepten und zur Konfiguration einer ARCore-Sitzung vertraut, bevor Sie fortfahren.
Tiefe aktivieren
Prüfen Sie in einer neuen ARCore-Sitzung, ob das Gerät eines Nutzers die Funktion „Tiefe“ unterstützt. Die Depth API wird aufgrund von Einschränkungen bei der Verarbeitungsleistung nicht von allen ARCore-kompatiblen Geräten unterstützt. Die Tiefe ist bei ARCore standardmäßig deaktiviert, um Ressourcen zu sparen. Aktivieren Sie den Tiefenmodus, damit Ihre Anwendung die Depth API verwendet.
int32_t is_depth_supported = 0; // Check whether the user's device supports the Depth API. ArSession_isDepthModeSupported(ar_session, AR_DEPTH_MODE_AUTOMATIC, &is_depth_supported); ArConfig* ar_config = NULL; ArConfig_create(ar_session, &ar_config); if (is_depth_supported) { ArConfig_setDepthMode(ar_session, ar_config, AR_DEPTH_MODE_AUTOMATIC); } CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS); ArConfig_destroy(ar_config);
Aktuelles Bild mit Rohtiefen aufnehmen
Rufen Sie ArFrame_acquireRawDepthImage16Bits()
auf, um das neueste Bild mit Tiefentiefe aufzunehmen.
int64_t previous_depth_image_timestamp_ns = -1; int64_t depth_image_timestamp_ns; ArImage* depth_image = NULL; // Acquire the raw depth image for the current frame. ArStatus acquire_image_status = ArFrame_acquireRawDepthImage16Bits(ar_session, ar_frame, &depth_image); if (acquire_image_status == AR_SUCCESS) { // Optional: compare raw depth image timestamps. Use this check if your app // uses only new depth data. ArImage_getTimestamp(ar_session, depth_image, &depth_image_timestamp_ns); if (depth_image_timestamp_ns != previous_depth_image_timestamp_ns) { // Raw depth image is based on new depth data. previous_depth_image_timestamp_ns = depth_image_timestamp_ns; // … } // Release the acquired image. ArImage_release(depth_image); }
Nicht alle Bildpixel, die über die Raw Depth API zurückgegeben werden, enthalten Tiefendaten und nicht jeder ARCore-Frame enthält ein neues Rohtiefenbild. Um zu ermitteln, ob das Rohtiefenbild für den aktuellen Frame neu ist, vergleichen Sie seinen Zeitstempel mit dem Zeitstempel des vorherigen Bildtiefenbilds. Wenn sich die Zeitstempel unterscheiden, basiert das Tiefenbild auf neuen Tiefendaten. Andernfalls ist das Tiefenbild eine Reprojektion früherer Tiefendaten.
Bild zum aktuellen Konfidenzintervall
Rufen Sie ArFrame_acquireRawDepthConfidenceImage()
auf, um das Konfidenzbild abzurufen. Sie können das Konfidenzbild verwenden, um die Genauigkeit der einzelnen Tiefenpixel zu überprüfen. Konfidenzbilder werden im Y8-Format zurückgegeben. Jedes Pixel ist eine vorzeichenlose 8-Bit-Ganzzahl. 0
gibt die geringste Konfidenz an, während 255
die höchste Konfidenz angibt.
// Acquire the raw depth confidence image. ArImage* confidence_image = NULL; ArStatus acquire_image_status = ArFrame_acquireRawDepthConfidenceImage( ar_session, ar_frame, &confidence_image); if (acquire_image_status == AR_SUCCESS) { // … // Release the acquired image. ArImage_release(confidence_image); }