Panduan Developer Gambar Augmented untuk Android NDK

Pelajari cara menggunakan Gambar Augmented di aplikasi Anda sendiri.

Prasyarat

Pastikan Anda memahami konsep AR dasar dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.

Membuat database gambar

Buat ArAugmentedImageDatabase untuk menyimpan gambar referensi. Ada dua cara:

  • Membuat database kosong
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);

File database dapat dibuat dengan Alat Gambar atau dengan memanggil ArAugmentedImageDatabase_serialize().

Menambahkan gambar ke database

Langkah ini bersifat opsional jika gambar referensi yang diinginkan telah dimuat dari file database. Untuk menambahkan gambar saat runtime, panggil ArAugmentedImageDatabase_addImage() seperti yang ditunjukkan di bawah. Lihat aplikasi contoh augmented_image_c untuk fungsi di namespace 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;

Nilai index dan name akan digunakan nanti untuk mengidentifikasi gambar referensi yang terdeteksi.

Mengaktifkan pelacakan gambar

Konfigurasikan sesi ARCore Anda untuk melacak gambar dengan mendaftarkan database gambar:

ArConfig_setAugmentedImageDatabase(ar_session_, ar_config,
                                   ar_augmented_image_database);
const ArStatus status = ArSession_configure(ar_session_, ar_config);

Selama sesi, ARCore menggunakan titik fitur dari gambar kamera untuk dicocokkan dengan titik fitur dalam database gambar.

Menemukan gambar augmented dalam sesi AR

Untuk mendapatkan gambar yang cocok, lakukan polling untuk ArAugmentedImage yang diperbarui dalam loop pembaruan frame Anda.

// 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).
  }
}

Mendukung berbagai kasus penggunaan

Saat mendeteksi Gambar Augmented, ARCore akan membuat Trackable untuk Gambar Augmented tersebut dan menetapkan ArTrackingState ke TRACKING dan ArAugmentedImageTrackingMethod ke FULL_TRACKING. Saat gambar yang dilacak keluar dari tampilan kamera, ARCore akan terus menetapkan ArTrackingState ke TRACKING, tetapi mengubah ArAugmentedImageTrackingMethod ke LAST_KNOWN_POSE sambil terus memberikan orientasi dan posisi gambar.

Aplikasi Anda harus menggunakan status pelacakan dan metode pelacakan secara berbeda, bergantung pada kasus penggunaan yang diinginkan.

  • Gambar tetap. Sebagian besar kasus penggunaan yang melibatkan gambar yang tetap berada di tempat (yaitu, tidak diharapkan untuk bergerak) dapat menggunakan ArTrackingState untuk menentukan apakah gambar telah terdeteksi dan apakah lokasinya diketahui. ArAugmentedImageTrackingMethod dapat diabaikan.

  • Gambar bergerak. Jika aplikasi Anda perlu melacak gambar yang bergerak, gunakan ArTrackingState dan ArAugmentedImageTrackingMethod untuk menentukan apakah gambar telah terdeteksi dan apakah posisinya diketahui.

Kasus penggunaan Gambar tetap Memindahkan gambar
Contoh Poster yang digantung di dinding Iklan di sisi bus
Pose dapat
dianggap valid jika
ArTrackingState == TRACKING ArTrackingState == TRACKING
dan
ArAugmentedImageTrackingMethod == FULL_TRACKING