Узнайте, как использовать дополненные изображения в своих приложениях.
Предварительные условия
Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции AR и то, как настроить сеанс ARCore .
Создайте базу данных изображений
Создайте ArAugmentedImageDatabase
для хранения эталонных изображений. Есть два способа:
- Создать пустую базу данных
ArAugmentedImageDatabase* ar_augmented_image_database = NULL; ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
- Чтение из файла базы данных изображений. Обратитесь к [примеру приложения AugmentedImage C] для
util::LoadFileFromAssetManager
.
std::string database_buffer; util::LoadFileFromAssetManager(asset_manager_, "sample_database.imgdb", &database_buffer); uint8_t* raw_buffer = reinterpret_cast<uint8_t*>(&database_buffer.front()); ArAugmentedImageDatabase* ar_augmented_image_database = NULL; const ArStatus status = ArAugmentedImageDatabase_deserialize( ar_session, raw_buffer, database_buffer.size(), &ar_augmented_image_database);
Файлы базы данных можно создать либо с помощью Image Tool , либо с помощью вызова ArAugmentedImageDatabase_serialize()
.
Добавить изображения в базу данных
Этот шаг является необязательным, если нужные эталонные изображения уже загружены из файла базы данных. Чтобы добавить изображение во время выполнения, вызовите ArAugmentedImageDatabase_addImage()
как показано ниже. Обратитесь к примеру приложения augmented_image_c для функций в пространстве имен util
.
int32_t width, height, stride, index; uint8_t* image_pixel_buffer = nullptr; constexpr const char kSampleImageName[] = "default.jpg"; bool load_image_result = util::LoadImageFromAssetManager( kSampleImageName, &width, &height, &stride, &image_pixel_buffer); uint8_t* grayscale_buffer = nullptr; util::ConvertRgbaToGrayscale(image_pixel_buffer, width, height, stride, &grayscale_buffer); int32_t grayscale_stride = stride / 4; const ArStatus status = ArAugmentedImageDatabase_addImage( ar_session_, ar_augmented_image_database, kSampleImageName, grayscale_buffer, width, height, grayscale_stride, &index); // If the physical size of the image is known, you can instead use // ArStatus ArAugmentedImageDatabase_addImageWithPhysicalSize // This will improve the initial detection speed. ARCore will still actively // estimate the physical size of the image as it is viewed from multiple // viewpoints. delete[] image_pixel_buffer; delete[] grayscale_buffer;
Значения index
и name
используются позже для определения того, какое эталонное изображение было обнаружено.
Включить отслеживание изображений
Настройте сеанс ARCore для отслеживания изображений, зарегистрировав базу данных изображений:
ArConfig_setAugmentedImageDatabase(ar_session_, ar_config, ar_augmented_image_database); const ArStatus status = ArSession_configure(ar_session_, ar_config);
Во время сеанса ARCore использует характерные точки изображения с камеры для сопоставления с точками в базе данных изображений.
Найдите дополненные изображения в сеансе AR
Чтобы получить совпадающие изображения, опросите обновленные ArAugmentedImage
в цикле обновления кадра.
// Update loop, in onDrawFrame ArTrackableList* updated_image_list = nullptr; ArTrackableList_create(ar_session_, &updated_image_list); ArFrame_getUpdatedTrackables( ar_session_, ar_frame_, AR_TRACKABLE_AUGMENTED_IMAGE, updated_image_list); int32_t image_list_size; ArTrackableList_getSize(ar_session_, updated_image_list, &image_list_size); for (int i = 0; i < image_list_size; ++i) { ArTrackable* ar_trackable = nullptr; ArTrackableList_acquireItem(ar_session_, updated_image_list, i, &ar_trackable); ArAugmentedImage* image = ArAsAugmentedImage(ar_trackable); ArTrackingState tracking_state; ArTrackable_getTrackingState(ar_session_, ar_trackable, &tracking_state); int image_index; ArAugmentedImage_getIndex(ar_session_, image, &image_index); if (tracking_state == AR_TRACKING_STATE_TRACKING) { util::ScopedArPose scopedArPose(ar_session_); ArAugmentedImage_getCenterPose(ar_session_, image, scopedArPose.GetArPose()); ArAnchor* image_anchor = nullptr; const ArStatus status = ArTrackable_acquireNewAnchor( ar_session_, ar_trackable, scopedArPose.GetArPose(), &image_anchor); // For example, you can now render content at the image anchor, choosing // content based on the image index (or name). } }
Поддержка различных вариантов использования
Когда ARCore обнаруживает дополненное изображение, он создает Trackable
для этого дополненного изображения и устанавливает для ArTrackingState
значение TRACKING
, а для ArAugmentedImageTrackingMethod
— значение FULL_TRACKING
. Когда отслеживаемое изображение выходит за пределы поля зрения камеры, ARCore продолжает устанавливать для ArTrackingState
TRACKING
, но меняет ArAugmentedImageTrackingMethod
на LAST_KNOWN_POSE
, продолжая при этом обеспечивать ориентацию и положение изображения.
Ваше приложение должно использовать состояние и метод отслеживания по-разному в зависимости от предполагаемого варианта использования.
Исправлены изображения . В большинстве случаев использования, включающих изображения, которые зафиксированы на месте (то есть не предполагается перемещение), можно просто использовать
ArTrackingState
, чтобы определить, обнаружено ли изображение и известно ли его местоположение.ArAugmentedImageTrackingMethod
можно игнорировать.Движущиеся изображения . Если вашему приложению необходимо отслеживать движущееся изображение, используйте как
ArTrackingState
, так иArAugmentedImageTrackingMethod
чтобы определить, обнаружено ли изображение и известно ли его положение.
Вариант использования | Фиксированное изображение | Движущееся изображение |
---|---|---|
Пример | Плакат висел на стене | Реклама на борту автобуса |
Поза может быть считается действительным, когда | ArTrackingState == TRACKING | ArTrackingState == TRACKING и ArAugmentedImageTrackingMethod == FULL_TRACKING |