„Rohtiefe“ in Ihrer Android-NDK-App verwenden

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
  • Ein Rohtiefenbild, das eine sehr genaue Tiefenschätzung für einige, aber nicht alle Pixel im Kamerabild enthält.
  • Ein Konfidenzbild, das die Konfidenz für jedes Bildpixel mit Rohtiefe angibt. Kamerabildpixel, die keine Tiefenschätzung haben, haben eine Konfidenz von null.
Full Depth API
  • Ein einzelnes "geglättetes" Tiefenbild, das eine Schätzung der Tiefe für jedes Pixel enthält.
  • Mit dieser API wird kein Konfidenzbild bereitgestellt.

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