Hướng dẫn dành cho nhà phát triển về hình ảnh tăng cường dành cho Android NDK

Tìm hiểu cách sử dụng Hình ảnh tăng cường trong ứng dụng của riêng bạn.

Điều kiện tiên quyết

Hãy đảm bảo rằng bạn hiểu 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ừ tệp cơ sở dữ liệu hình ảnh. Hãy tham khảo [ứng dụng mẫu C AugmentedImage] để biết 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 bằng cách gọi ArAugmentedImageDatabase_serialize().

Thêm hình ảnh vào cơ sở dữ liệu

Bạn không bắt buộc phải thực hiện bước này nếu hình ảnh tham chiếu mong 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. Tham khảo 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ị indexname 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 này, ARCore sử dụng các điểm đặc trưng từ hình ảnh máy ảnh để so khớp với các điểm đặc trưng trong cơ sở dữ liệu hình ảnh.

Tìm hình ảnh tăng cường trong một phiên AR

Để nhận hình ảnh đã so khớp, hãy thăm dò ý kiến về 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 Hình ảnh tăng cường, ARCore sẽ tạo một Trackable cho Hình ảnh tăng cường đó và đặt ArTrackingState thành TRACKINGArAugmentedImageTrackingMethod thành FULL_TRACKING. Khi hình ảnh được theo dõi di chuyển ra khỏi khung hình máy ảnh, ARCore sẽ tiếp tục đặt ArTrackingState thành TRACKING, nhưng thay đổi ArAugmentedImageTrackingMethod thành LAST_KNOWN_POSE trong khi 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 thức theo dõi theo cách khác nhau tuỳ thuộc vào trường hợp sử dụng dự kiến.

  • Sửa hình ảnh. Hầu hết các trường hợp sử dụng liên quan đến hình ảnh cố định tại chỗ (tức là không di chuyển) chỉ cần sử dụng ArTrackingState để xác định xem hình ảnh đã được phát hiện hay chưa và vị trí của hình ảnh đó có được biết hay không. Bạn có thể bỏ qua ArAugmentedImageTrackingMethod.

  • Hình ảnh chuyển động. Nếu ứng dụng của bạn cần theo dõi hình ảnh chuyển động, hãy sử dụng cả ArTrackingStateArAugmentedImageTrackingMethod để xác định xem hình ảnh đã được phát hiện hay chưa và liệu vị trí của hình ảnh có được biết hay không.

Trường hợp sử dụng Hình ảnh đã sửa Hình ảnh động
Ví dụ: Một tấm áp phích treo trên tường Quảng cáo ở bên hông xe buýt
Tư thế có thể được
coi là hợp lệ khi
ArTrackingState == TRACKING ArTrackingState == TRACKING

ArAugmentedImageTrackingMethod == FULL_TRACKING