Android NDK 適用的擴增圖片開發人員指南

瞭解如何在自己的應用程式中使用擴增圖片。

必要條件

請務必瞭解基本 AR 概念 以及如何在繼續操作前設定 ARCore 工作階段

建立映像檔資料庫

建立 ArAugmentedImageDatabase 來儲存參考圖片。以下提供兩種方法:

  • 建立空白資料庫
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);

你可以使用 Image Tool 或呼叫 ArAugmentedImageDatabase_serialize() 建立資料庫檔案。

將圖片新增至資料庫

如果已經從資料庫檔案載入您想要的參考圖片,則不一定要執行這個步驟。如要在執行階段新增圖片,請呼叫 ArAugmentedImageDatabase_addImage(),如下所示。如要瞭解 util 命名空間中的函式,請參閱 augmented_image_c 範例應用程式

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;

系統稍後會使用 indexname 值來識別偵測到的參考圖片。

啟用圖片追蹤功能

設定 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 擴增圖片和組合 ArTrackingStateTRACKING,並將 ArAugmentedImageTrackingMethod 變更為 FULL_TRACKING。系統追蹤圖片的時機 ,之後 ARCore 會繼續設定 向「TRACKING」送出訊息 ArTrackingState, 但變更了 ArAugmentedImageTrackingMethodLAST_KNOWN_POSE,同時繼續提供 該圖片

請視預期用途,以不同方式使用追蹤狀態和追蹤方式 確認是否屬於此情況

  • 固定圖片:大多數涉及固定圖片的用途 只要使用 ArTrackingState 就能判斷 是否會偵測到圖片,以及圖片的位置是否已知。 您可以忽略 ArAugmentedImageTrackingMethod

  • 移動圖片。如果您的應用程式需要追蹤移動的圖片,請同時使用 ArTrackingStateArAugmentedImageTrackingMethod 用來判斷圖片是否已 以及其位置是否已知。

用途 固定圖片 正在移動圖片
範例 掛在牆上的海報 公車旁的廣告
姿勢可以:
視為有效的
ArTrackingState == TRACKING ArTrackingState == TRACKING

ArAugmentedImageTrackingMethod == FULL_TRACKING