Tìm hiểu cách sử dụng Hình ảnh tăng cường trong ứng dụng của bạn.
Điều kiện tiên quyết
Đảm bảo rằng bạn hiểu rõ các khái niệm cơ bản về AR và cách định cấu hình phiên ARCore trước khi tiếp tục.
Tạo cơ sở dữ liệu hình ảnh
Tạo ArAugmentedImageDatabase
để lưu trữ hình ảnh tham chiếu. Có hai cách:
- Tạo cơ sở dữ liệu trống
ArAugmentedImageDatabase* ar_augmented_image_database = NULL; ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
- Đọc từ một tệp cơ sở dữ liệu hình ảnh. Tham khảo [ứng dụng mẫu AugmentedImage C] cho
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);
Bạn có thể tạo tệp cơ sở dữ liệu bằng Công cụ hình ảnh hoặc gọi ArAugmentedImageDatabase_serialize()
.
Thêm hình ảnh vào cơ sở dữ liệu
Bước này là không bắt buộc nếu hình ảnh tham chiếu bạn muốn đã được tải từ tệp cơ sở dữ liệu. Để thêm hình ảnh trong thời gian chạy, hãy gọi ArAugmentedImageDatabase_addImage()
như minh hoạ dưới đây. Hãy tham khảo ứng dụng mẫu augmented_image_c để biết các hàm trong không gian tên 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;
Sau đó, các giá trị index
và name
sẽ được dùng để xác định hình ảnh tham chiếu nào đã được phát hiện.
Bật tính năng theo dõi hình ảnh
Định cấu hình phiên ARCore để theo dõi hình ảnh bằng cách đăng ký cơ sở dữ liệu hình ảnh:
ArConfig_setAugmentedImageDatabase(ar_session_, ar_config, ar_augmented_image_database); const ArStatus status = ArSession_configure(ar_session_, ar_config);
Trong phiên hoạt động này, ARCore sử dụng các điểm tính năng từ hình ảnh camera để so khớp với các điểm tính năng trong cơ sở dữ liệu hình ảnh.
Tìm hình ảnh tăng cường trong phiên thực tế tăng cường
Để xem những hình ảnh phù hợp, hãy thăm dò ý kiến để tìm các ArAugmentedImage
đã cập nhật trong vòng lặp cập nhật khung hình.
// 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). } }
Hỗ trợ nhiều trường hợp sử dụng
Khi phát hiện thấy một Hình ảnh tăng cường, ARCore sẽ tạo một Trackable
cho hình ảnh đó
Hình ảnh tăng cường và tập hợp ArTrackingState
tới TRACKING
và ArAugmentedImageTrackingMethod
đến FULL_TRACKING
. Trường hợp bạn theo dõi hình ảnh
di chuyển ra khỏi chế độ xem máy ảnh, ARCore vẫn tiếp tục thiết lập
ArTrackingState
đến TRACKING
,
nhưng lại thay đổi ArAugmentedImageTrackingMethod
vào LAST_KNOWN_POSE
trong khi vẫn tiếp tục cung cấp hướng và vị trí của
hình ảnh.
Ứng dụng của bạn nên sử dụng trạng thái theo dõi và phương pháp theo dõi khác nhau tuỳ thuộc vào mục đích sử dụng trường hợp.
Hình ảnh cố định. Hầu hết các trường hợp sử dụng liên quan đến hình ảnh được cố định tại chỗ (nghĩa là không di chuyển) có thể chỉ cần sử dụng
ArTrackingState
để xác định liệu hình ảnh có được phát hiện hay không và vị trí của nó có được biết hay không. Bạn có thể bỏ quaArAugmentedImageTrackingMethod
.Hình ảnh chuyển động. Nếu ứng dụng của bạn cần theo dõi một hình ảnh chuyển động, hãy sử dụng cả hai
ArTrackingState
vàArAugmentedImageTrackingMethod
để xác định xem hình ảnh đã được phát hiện được và liệu vị trí của nó đã biết hay chưa.
Trường hợp sử dụng | Hình ảnh cố định | Đang di chuyển hình ảnh |
---|---|---|
Ví dụ: | Một tấm áp phích được treo trên tường | Quảng cáo bên cạnh xe buýt |
Tư thế đó có thể là được coi là hợp lệ khi |
ArTrackingState == TRACKING |
ArTrackingState == TRACKING
và ArAugmentedImageTrackingMethod == FULL_TRACKING |