了解如何在您自己的应用中使用增强图像。
前提条件
确保您了解 AR 基础概念 以及如何在继续之前配置 ARCore 现场录像。
创建图片数据库
创建 ArAugmentedImageDatabase
来存储参考图片。有两种方法:
- 创建空数据库
ArAugmentedImageDatabase* ar_augmented_image_database = NULL; ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
- 从图片数据库文件中读取。请参阅
util::LoadFileFromAssetManager
的 [AugmentedImage C 示例应用]。
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);
您可以使用图片工具或调用 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 将继续设置
向TRACKING
发送了 ArTrackingState
,
但会更改ArAugmentedImageTrackingMethod
传递给 LAST_KNOWN_POSE
,同时继续提供
图片。
您的应用应根据预期用途以不同的方式使用跟踪状态和跟踪方法 这种情况。
固定图片。涉及固定位置图片的大多数用例 (即不会迁移)只需使用
ArTrackingState
即可确定 图片是否已被检测到,以及其位置是否已知。 可以忽略ArAugmentedImageTrackingMethod
。动态图片。如果您的应用需要跟踪动态图片,请同时使用
ArTrackingState
和ArAugmentedImageTrackingMethod
,用于确定图片是否已 以及其位置是否已知。
使用场景 | 固定图片 | 动态图片 |
---|---|---|
示例 | 一张挂在墙上的海报 | 公交车车身上的广告 |
姿势可以是 在以下情况下将被视为有效: |
ArTrackingState == TRACKING |
ArTrackingState == TRACKING
和 ArAugmentedImageTrackingMethod == FULL_TRACKING
|