Pelajari cara menggunakan Gambar Augmented di aplikasi Anda sendiri.
Prasyarat
Pastikan Anda memahami konsep dasar AR 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);
- Membaca dari file database gambar. Lihat [aplikasi contoh AugmentedImage C] untuk
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);
File database dapat dibuat dengan Alat Gambar atau dengan memanggil ArAugmentedImageDatabase_serialize()
.
Menambahkan gambar ke database
Langkah ini 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 dalam 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.
Aktifkan pelacakan gambar
Konfigurasi sesi ARCore 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 tersebut, ARCore menggunakan titik fitur dari gambar kamera untuk dicocokkan dengan titik fitur yang ada di database gambar.
Menemukan gambar yang ditingkatkan dalam sesi AR
Untuk mendapatkan gambar yang cocok, cari ArAugmentedImage
yang diperbarui di loop pembaruan frame.
// 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 tersebut
Gambar Augmented dan kumpulan ArTrackingState
ke TRACKING
dan ArAugmentedImageTrackingMethod
hingga FULL_TRACKING
. Kapan gambar yang dilacak
bergerak keluar dari tampilan kamera, ARCore terus mengatur
ArTrackingState
kepada TRACKING
,
tetapi mengubah ArAugmentedImageTrackingMethod
ke LAST_KNOWN_POSE
sambil terus memberikan orientasi dan posisi
gambar tersebut.
Aplikasi Anda harus menggunakan status pelacakan dan metode pelacakan secara berbeda bergantung pada penggunaan yang dimaksudkan ini masalahnya atau bukan.
Gambar tetap. Sebagian besar kasus penggunaan yang melibatkan gambar yang sudah diperbaiki (yaitu, tidak diperkirakan akan berpindah) cukup menggunakan
ArTrackingState
untuk menentukan apakah gambar telah terdeteksi dan apakah lokasinya diketahui atau tidak.ArAugmentedImageTrackingMethod
dapat diabaikan.Gambar bergerak. Jika aplikasi Anda perlu melacak gambar bergerak, gunakan keduanya
ArTrackingState
danArAugmentedImageTrackingMethod
untuk menentukan apakah gambar telah terdeteksi dan apakah posisinya diketahui.
Kasus penggunaan | Gambar tetap | Gambar bergerak |
---|---|---|
Contoh | Sebuah poster digantung di dinding | Iklan di sisi bus |
Posenya bisa dianggap valid saat |
ArTrackingState == TRACKING |
ArTrackingState == TRACKING
dan ArAugmentedImageTrackingMethod == FULL_TRACKING |