ดูวิธีใช้รูปภาพความจริงเสริมในแอปของคุณเอง
ข้อกำหนดเบื้องต้น
โปรดทำความเข้าใจแนวคิดพื้นฐานของ 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
|