Используйте Raw Depth в своем приложении Android NDK

API Raw Depth предоставляет данные о глубине для изображения с камеры, которые имеют более высокую точность, чем данные API полной глубины, но не всегда охватывают каждый пиксель. Необработанные изображения глубины вместе с соответствующими им достоверными изображениями также могут быть дополнительно обработаны, что позволяет приложениям использовать только те данные о глубине, которые имеют достаточную точность для их индивидуального варианта использования.

Совместимость устройств

Raw Depth доступен на всех устройствах, поддерживающих Depth API . API Raw Depth, как и API Full Depth, не требует поддерживаемого аппаратного датчика глубины, такого как датчик времени пролета (ToF). Однако как Raw Depth API, так и Full Depth API используют любые поддерживаемые аппаратные датчики, которые могут быть на устройстве.

API необработанной глубины и API полной глубины

API Raw Depth предоставляет оценки глубины с более высокой точностью, но необработанные изображения глубины могут не включать оценки глубины для всех пикселей изображения с камеры. Напротив, API полной глубины предоставляет оценку глубины для каждого пикселя, но данные о глубине для каждого пикселя могут быть менее точными из-за сглаживания и интерполяции оценок глубины. Формат и размер изображений глубины одинаковы для обоих API. Отличается только содержание.

В следующей таблице показаны различия между API Raw Depth и API Full Depth с использованием изображения стула и стола на кухне.

API Возврат Изображение с камеры Изображение глубины Уверенный образ
API необработанной глубины
  • Необработанное изображение глубины, содержащее очень точную оценку глубины для некоторых, но не всех пикселей изображения с камеры.
  • Уверенное изображение, которое дает уверенность каждому пикселю необработанного изображения глубины. Пиксели изображения камеры, у которых нет оценки глубины, имеют нулевую достоверность.
Полная глубина API
  • Одно «сглаженное» изображение глубины, содержащее оценку глубины для каждого пикселя.
  • С помощью этого API не предоставляется достоверное изображение.
Н/Д

Изображения уверенности

В достоверных изображениях, возвращаемых API Raw Depth, более светлые пиксели имеют более высокие значения достоверности: белые пиксели представляют полную достоверность, а черные — отсутствие достоверности. В целом, области изображения с камеры, имеющие больше текстуры, например дерево, будут иметь более высокую достоверность глубины, чем области без нее, например глухая стена. Поверхности без текстуры обычно дают нулевую достоверность.

Если целевое устройство имеет поддерживаемый аппаратный датчик глубины, достоверность в областях изображения, достаточно близких к камере, вероятно, будет выше, даже на бестекстурных поверхностях.

Рассчитать стоимость

Стоимость вычислений для API Raw Depth составляет примерно половину стоимости вычислений для API полной глубины.

Варианты использования

С помощью API Raw Depth вы можете получать изображения глубины, которые обеспечивают более детальное представление геометрии объектов на сцене. Необработанные данные о глубине могут быть полезны при создании AR-приложений, где для задач понимания геометрии требуется повышенная точность и детализация глубины. Некоторые варианты использования включают в себя:

  • 3D реконструкция
  • Измерение
  • Обнаружение формы

Предварительные условия

Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции AR и то, как настроить сеанс ARCore .

Включить глубину

В новом сеансе ARCore проверьте, поддерживает ли устройство пользователя Depth. Не все ARCore-совместимые устройства поддерживают Depth API из-за ограничений вычислительной мощности. Для экономии ресурсов глубина в ARCore по умолчанию отключена. Включите режим глубины, чтобы ваше приложение использовало Depth API.

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

Получите последнее необработанное изображение глубины.

Вызовите ArFrame_acquireRawDepthImage16Bits() чтобы получить последнее необработанное изображение глубины.

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

Не все пиксели изображения, возвращаемые через API Raw Depth, будут содержать данные глубины, и не каждый кадр ARCore будет содержать новое необработанное изображение глубины. Чтобы определить, является ли необработанное изображение глубины для текущего кадра новым, сравните его временную метку с временной меткой предыдущего необработанного изображения глубины. Если временные метки разные, необработанное изображение глубины основывается на новых данных о глубине. В противном случае изображение глубины представляет собой перепроекцию предыдущих данных глубины.

Получите новейший имидж доверия

Вызовите ArFrame_acquireRawDepthConfidenceImage() чтобы получить достоверное изображение. Вы можете использовать доверительное изображение, чтобы проверить точность каждого необработанного пикселя глубины. Изображения уверенности возвращаются в формате Y8. Каждый пиксель представляет собой 8-битное целое число без знака. 0 означает наименьшую достоверность, а 255 — наибольшую.

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