Cómo usar profundidad sin procesar en tu app de NDK de Android

La API de Raw Depth proporciona datos de profundidad para una imagen de cámara que tiene mayor precisión que los datos de la API de Depth completa, pero no siempre cubre cada píxel. Las imágenes de profundidad sin procesar, junto con sus imágenes de confianza coincidentes, también se pueden procesar aún más, lo que permite que las apps usen solo los datos de profundidad que tengan una precisión suficiente para su caso de uso individual.

Compatibilidad con dispositivos

La profundidad sin procesar está disponible en todos los dispositivos compatibles con la API de Depth. La API de Raw Depth, al igual que la API de Depth completa, no requiere un sensor de profundidad de hardware compatible, como un sensor de tiempo de vuelo (ToF). Sin embargo, tanto la API de Raw Depth como la de Depth completa usan cualquier sensor de hardware compatible que pueda tener un dispositivo.

API de Raw Depth frente a la API de Depth completa

La API de Raw Depth proporciona estimaciones de profundidad con mayor precisión, pero es posible que las imágenes de profundidad sin procesar no incluyan estimaciones de profundidad para todos los píxeles de la imagen de la cámara. En cambio, la API de Depth completa proporciona una profundidad estimada para cada píxel, pero es posible que los datos de profundidad por píxel sean menos precisos debido al suavizado y la interpolación de las estimaciones de profundidad. El formato y el tamaño de las imágenes de profundidad son los mismos en ambas APIs. Solo difiere el contenido.

En la siguiente tabla, se ilustran las diferencias entre la API de Raw Depth y la API completa de Depth usando una imagen de una silla y una mesa en la cocina.

API Devuelve Imagen de la cámara Imagen de profundidad Imagen de confianza
API de Raw Depth
  • Es una imagen de profundidad sin formato que contiene una estimación de profundidad muy precisa para algunos píxeles, pero no todos, de la imagen de la cámara.
  • Una imagen confiable que proporciona confianza a cada píxel de imagen de profundidad sin procesar. Los píxeles de las imágenes de la cámara que no tienen una estimación de profundidad tienen un valor de confianza de cero.
API de Full Depth
  • Una sola imagen de profundidad “suave” que contiene una estimación de la profundidad para cada píxel.
  • No se proporciona una imagen de confianza con esta API.
No disponible

Imágenes de confianza

En las imágenes de confianza que muestra la API de Raw Depth, los píxeles más claros tienen valores de confianza más altos, los píxeles blancos representan una confianza total, mientras que los negros representan la falta de confianza. En general, las regiones de la imagen de la cámara que tienen más textura, como un árbol, tendrán mayor confianza de profundidad sin procesar que las regiones que no la tienen, como una pared en blanco. Las superficies sin textura generalmente producen un valor de confianza de cero.

Si el dispositivo de destino tiene un sensor de profundidad de hardware compatible, es probable que la confianza en las áreas de la imagen lo suficientemente cercanas a la cámara sea mayor, incluso en superficies sin textura.

Costo de procesamiento

El costo de procesamiento de la API de Raw Depth es aproximadamente la mitad del costo de procesamiento de la API de Depth completa.

Casos de uso

Con la API de Raw Depth, puedes obtener imágenes de profundidad que proporcionen una representación más detallada de la geometría de los objetos de la escena. Los datos de profundidad sin procesar pueden ser útiles cuando se crean experiencias de RA en las que se necesitan más detalles y precisión de profundidad para las tareas de comprensión de geometría. Estos son algunos casos de uso:

  • Reconstrucción 3D
  • Medición
  • Detección de forma

Requisitos previos

Asegúrate de comprender los conceptos fundamentales de RA y cómo configurar una sesión de ARCore antes de continuar.

Habilitar profundidad

En una nueva sesión de ARCore, verifica si el dispositivo de un usuario es compatible con Depth. No todos los dispositivos compatibles con ARCore admiten la API de Depth debido a limitaciones de la potencia de procesamiento. Para guardar recursos, la profundidad está inhabilitada de forma predeterminada en ARCore. Habilita el modo de profundidad para que tu app use la API de Depth.

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

Obtén la imagen de profundidad sin procesar más reciente

Llama a ArFrame_acquireRawDepthImage16Bits() para adquirir la imagen de profundidad sin formato más reciente.

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

No todos los píxeles de imagen que se muestran a través de la API de Raw Depth contendrán datos de profundidad, y no todos los fotogramas de ARCore contendrán una nueva imagen de profundidad sin procesar. Para determinar si la imagen de profundidad sin procesar para el fotograma actual es nueva, compara su marca de tiempo con la marca de tiempo de la imagen de profundidad anterior sin procesar. Si las marcas de tiempo son diferentes, la imagen de profundidad sin procesar se basa en datos de profundidad nuevos. De lo contrario, la imagen de profundidad es una reproyección de datos de profundidad anteriores.

Adquiere la imagen de confianza más reciente

Llama a ArFrame_acquireRawDepthConfidenceImage() para adquirir la imagen de confianza. Puedes usar la imagen de confianza para verificar la precisión de cada píxel de profundidad sin procesar. Las imágenes de confianza se muestran en formato Y8. Cada píxel es un número entero sin firma de 8 bits. 0 indica el nivel de confianza menor, mientras que 255 indica el más alto.

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