Изучите среду пользователя в Android NDK (C)

Узнайте, как использовать API семантики сцены в своих приложениях.

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

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

Пример входного изображения, семантического изображения и семантического достоверного изображения.

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

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

Включить семантику сцены

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

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

// Check whether the user's device supports the Scene Semantics API.
int32_t is_scene_semantics_supported = 0;
ArSession_isSemanticModeSupported(ar_session, AR_SEMANTIC_MODE_ENABLED, &is_scene_semantics_supported);

// Configure the session for AR_SEMANTIC_MODEL_ENABLED.
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
if (is_scene_semantics_supported) {
  ArConfig_setSemanticMode(ar_session, ar_config, AR_SEMANTIC_MODE_ENABLED);
}
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

Получить смысловой образ

После включения семантики сцены можно получить семантическое изображение. Семантическое изображение — это изображение AR_IMAGE_FORMAT_Y8 , где каждый пиксель соответствует семантической метке, определенной ArSemanticLabel .

Используйте ArFrame_acquireSemanticImage() для получения семантического изображения:

// Retrieve the semantic image for the current frame, if available.
ArImage* semantic_image = NULL;
if (ArFrame_acquireSemanticImage(ar_session, ar_frame, &semantic_image) != AR_SUCCESS) {
  // No semantic image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a chance to run yet.
  return;
}
// If a semantic image is available, use it here.

Выходные семантические изображения должны быть доступны примерно через 1-3 кадра от начала сеанса, в зависимости от устройства.

Получите имидж уверенности

В дополнение к семантическому изображению, которое предоставляет метку для каждого пикселя, API также предоставляет доверительное изображение соответствующих значений достоверности пикселей. Достоверное изображение представляет собой изображение AR_IMAGE_FORMAT_Y8 , где каждый пиксель соответствует значению в диапазоне [0, 255] , соответствующему вероятности, связанной с семантической меткой для каждого пикселя.

Используйте ArFrame_acquireSemanticConfidenceImage() для получения изображения семантической достоверности:

// Retrieve the semantic confidence image for the current frame, if available.
ArImage* semantic_confidence_image = NULL;
if (ArFrame_acquireSemanticConfidenceImage(ar_session, ar_frame, &semantic_confidence_image) != AR_SUCCESS) {
  // No semantic confidence image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a chance to run yet.
  return;
}
// If a semantic confidence image is available, use it here.

Выходные достоверные изображения должны быть доступны примерно через 1–3 кадра с начала сеанса, в зависимости от устройства.

Запрос доли пикселей для семантической метки

Вы также можете запросить долю пикселей в текущем кадре, принадлежащих определенному классу, например небу. Этот запрос более эффективен, чем возврат семантического изображения и выполнение попиксельного поиска конкретной метки. Возвращаемая дробь представляет собой значение с плавающей запятой в диапазоне [0.0, 1.0] .

Используйте ArFrame_getSemanticLabelFraction() , чтобы получить дробь для данной метки:

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
float out_fraction = 0.0f;
if (ArFrame_getSemanticLabelFraction(ar_session, ar_frame, AR_SEMANTIC_LABEL_SKY, &out_fraction) != AR_SUCCESS) {
  // No fraction of semantic labels was retrieved for this frame.
}