คู่มือนักพัฒนาซอฟต์แวร์ภาพ Augmented สำหรับ Android NDK

ดูวิธีใช้รูปภาพความจริงเสริมในแอปของคุณเอง

ข้อกำหนดเบื้องต้น

โปรดทำความเข้าใจแนวคิดพื้นฐานของ AR และวิธีกำหนดค่าเซสชัน ARCore ก่อนดำเนินการต่อ

สร้างฐานข้อมูลรูปภาพ

สร้าง ArAugmentedImageDatabase เพื่อจัดเก็บรูปภาพอ้างอิง ซึ่งทำได้ 2 วิธีดังนี้

  • สร้างฐานข้อมูลว่าง
ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
  • อ่านจากไฟล์ฐานข้อมูลรูปภาพ ดู util::LoadFileFromAssetManager ใน [AugmentedImage C sample app]
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);

คุณสร้างไฟล์ฐานข้อมูลได้ด้วยเครื่องมือรูปภาพหรือเรียกใช้ 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;

ระบบจะใช้ค่า index และ name ในภายหลังเพื่อระบุรูปภาพอ้างอิงที่ตรวจพบ

เปิดใช้การติดตามรูปภาพ

กำหนดค่าเซสชัน 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 สำหรับภาพความจริงเสริมนั้น และตั้งค่า ArTrackingState เป็น TRACKING และ ArAugmentedImageTrackingMethod เป็น FULL_TRACKING เมื่อรูปภาพที่ติดตามออกจากมุมมองกล้อง ARCore จะยังคงตั้งค่า ArTrackingState เป็น TRACKING แต่เปลี่ยน ArAugmentedImageTrackingMethod เป็น LAST_KNOWN_POSE พร้อมกับระบุการวางแนวและตำแหน่งของรูปภาพต่อไป

แอปควรใช้สถานะการติดตามและวิธีการติดตามแตกต่างกันไปตามกรณีการใช้งานที่ต้องการ

  • รูปภาพแบบคงที่ Use Case ส่วนใหญ่ที่เกี่ยวข้องกับรูปภาพที่อยู่กับที่ (ซึ่งไม่คาดว่าจะเคลื่อนไหว) จะใช้ ArTrackingState เพื่อระบุว่าระบบตรวจพบรูปภาพหรือไม่ และทราบตำแหน่งของรูปภาพหรือไม่ ArAugmentedImageTrackingMethod นั้นสามารถละเว้นได้

  • ภาพเคลื่อนไหว หากแอปของคุณต้องติดตามรูปภาพที่เคลื่อนไหว ให้ใช้ทั้ง ArTrackingState และ ArAugmentedImageTrackingMethod เพื่อระบุว่าระบบตรวจพบรูปภาพหรือไม่ และระบบทราบตำแหน่งของรูปภาพหรือไม่

กรณีการใช้งาน รูปภาพแบบคงที่ รูปภาพเคลื่อนไหว
ตัวอย่าง โปสเตอร์ที่แขวนอยู่บนผนัง โฆษณาด้านข้างรถเมล์
ท่าโพสจะ
ถือว่าถูกต้องเมื่อ
ArTrackingState == TRACKING ArTrackingState == TRACKING
และ
ArAugmentedImageTrackingMethod == FULL_TRACKING