Hướng dẫn cho nhà phát triển hình ảnh tăng cường 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 bạn.

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

Đảm bảo rằng bạn hiểu các khái niệm cơ bản về thực tế tăng cường 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 một ArAugmentedImageDatabase để lưu trữ các hình ảnh đối 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);
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ước này là tùy chọn nếu hình ảnh tham chiếu bạn 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ư hình bên dưới. Tham khảo ứng dụng mẫu augmented_image_c để biết các hàm trong vùng chứa 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;

Giá trị indexname được dùng sau đó để xác định hình ảnh tham chiếu đã đượ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 của bạn để 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, ARCore sử dụng các điểm tính năng từ hình ảnh máy ảnh để phù hợp với các điểm trong cơ sở dữ liệu hình ảnh.

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

Để nhận được hình ảnh phù hợp, cuộc thăm dò ý kiến đã cập nhật ArAugmentedImage 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 một 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 chế độ xem máy ảnh, ARCore tiếp tục đặt ArTrackingState thành TRACKING, nhưng sẽ thay đổi ArAugmentedImageTrackingMethod cho 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 tùy theo trường hợp sử dụng mục đích.

  • 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 một nơi (nghĩa là không dự kiến 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à liệu có biết vị trí của hình ảnh đó không. ArAugmentedImageTrackingMethod có thể bị bỏ qua.

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

Trường hợp sử dụng Hình ảnh đã khắc phục Di chuyển hình ảnh
Ví dụ: Áp phích treo trên tường Quảng cáo bên cạnh xe buýt
Vị trí có thể được coi là
hợp lệ khi
ArTrackingState == TRACKING ArTrackingState == TRACKING

ArAugmentedImageTrackingMethod == FULL_TRACKING