ดูวิธีใช้รูปภาพความจริงเสริมในแอปของคุณเอง
ข้อกำหนดเบื้องต้น
โปรดทำความเข้าใจแนวคิดพื้นฐานเกี่ยวกับ AR และวิธีกำหนดค่าเซสชัน ARCore ก่อนดำเนินการต่อ
สร้างฐานข้อมูลรูปภาพ
ฐานข้อมูลรูปภาพแต่ละรายการสามารถจัดเก็บข้อมูลได้สูงสุด 1,000 ภาพ
การสร้างAugmentedImageDatabase
มี 2 วิธีดังนี้
- โหลดฐานข้อมูลรูปภาพที่บันทึกไว้ จากนั้นจึงเพิ่มรูปภาพอ้างอิง (ไม่บังคับ)
- สร้างฐานข้อมูลว่างใหม่ จากนั้นเพิ่มรูปภาพอ้างอิงทีละรูป
โหลดฐานข้อมูลรูปภาพที่บันทึกไว้
ใช้ AugmentedImageDatabase.deserialize()
เพื่อโหลดฐานข้อมูลรูปภาพที่มีอยู่:
Java
AugmentedImageDatabase imageDatabase; try (InputStream inputStream = this.getAssets().open("example.imgdb")) { imageDatabase = AugmentedImageDatabase.deserialize(session, inputStream); } catch (IOException e) { // The Augmented Image database could not be deserialized; handle this error appropriately. }
Kotlin
val imageDatabase = this.assets.open("example.imgdb").use { AugmentedImageDatabase.deserialize(session, it) }
คุณสร้างฐานข้อมูลรูปภาพได้โดยใช้เครื่องมือบรรทัดคำสั่ง arcoreimg
ในระหว่างการพัฒนา หรือเรียกใช้ AugmentedImageDatabase.serialize()
ในฐานข้อมูลที่โหลดไว้ในหน่วยความจำ
สร้างฐานข้อมูลว่างใหม่
หากต้องการสร้างฐานข้อมูลรูปภาพที่ว่างเปล่าระหว่างรันไทม์ ให้ใช้เครื่องมือสร้าง AugmentedImageDatabase
ดังนี้
Java
AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);
Kotlin
val imageDatabase = AugmentedImageDatabase(session)
เพิ่มรูปภาพลงในฐานข้อมูลที่มีอยู่
เพิ่มรูปภาพลงในฐานข้อมูลรูปภาพโดยการเรียกใช้
AugmentedImageDatabase.addImage()
สำหรับแต่ละรูปภาพ โดยระบุ widthInMeters
ที่เป็นตัวเลือก
Java
Bitmap bitmap; try (InputStream bitmapString = getAssets().open("dog.jpg")) { bitmap = BitmapFactory.decodeStream(bitmapString); } catch (IOException e) { // The bitmap could not be found in assets; handle this error appropriately. throw new AssertionError("The bitmap could not be found in assets.", e); } // If the physical size of the image is not known, use addImage(String, Bitmap) instead, at the // expense of an increased image detection time. float imageWidthInMeters = 0.10f; // 10 cm int dogIndex = imageDatabase.addImage("dog", bitmap, imageWidthInMeters);
Kotlin
val bitmap = assets.open("dog.jpg").use { BitmapFactory.decodeStream(it) } // If the physical size of the image is not known, use addImage(String, Bitmap) instead, at the // expense of an increased image detection time. val imageWidthInMeters = 0.10f // 10 cm val dogIndex = imageDatabase.addImage("dog", bitmap, imageWidthInMeters)
คุณจะนําดัชนีที่แสดงผลไปใช้ระบุรูปภาพอ้างอิงที่ตรวจพบในภายหลังได้
เปิดใช้การติดตามรูปภาพ
กำหนดค่าเซสชัน ARCore เพื่อเริ่มติดตามรูปภาพโดยการตั้งค่าเซสชัน กำหนดค่าเป็นฐานข้อมูลที่กำหนดค่าด้วยฐานข้อมูลรูปภาพที่ต้องการ
Java
Config config = new Config(session); config.setAugmentedImageDatabase(imageDatabase); session.configure(config);
Kotlin
val config = Config(session) config.augmentedImageDatabase = imageDatabase session.configure(config)
ในระหว่างเซสชัน ARCore จะค้นหารูปภาพโดยการจับคู่จุดสังเกตจากรูปภาพจากกล้องกับจุดสังเกตในฐานข้อมูลรูปภาพ
หากต้องการดูรูปภาพที่ตรงกัน ให้ตรวจสอบAugmentedImage
ที่อัปเดตแล้วในลูปการอัปเดตเฟรม
Java
Collection<AugmentedImage> updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage.class); for (AugmentedImage img : updatedAugmentedImages) { if (img.getTrackingState() == TrackingState.TRACKING) { // Use getTrackingMethod() to determine whether the image is currently // being tracked by the camera. switch (img.getTrackingMethod()) { case LAST_KNOWN_POSE: // The planar target is currently being tracked based on its last // known pose. break; case FULL_TRACKING: // The planar target is being tracked using the current camera image. break; case NOT_TRACKING: // The planar target isn't been tracked. break; } // You can also check which image this is based on img.getName(). if (img.getIndex() == dogIndex) { // TODO: Render a 3D version of a dog in front of img.getCenterPose(). } else if (img.getIndex() == catIndex) { // TODO: Render a 3D version of a cat in front of img.getCenterPose(). } } }
Kotlin
val updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage::class.java) for (img in updatedAugmentedImages) { if (img.trackingState == TrackingState.TRACKING) { // Use getTrackingMethod() to determine whether the image is currently // being tracked by the camera. when (img.trackingMethod) { AugmentedImage.TrackingMethod.LAST_KNOWN_POSE -> { // The planar target is currently being tracked based on its last known pose. } AugmentedImage.TrackingMethod.FULL_TRACKING -> { // The planar target is being tracked using the current camera image. } AugmentedImage.TrackingMethod.NOT_TRACKING -> { // The planar target isn't been tracked. } } // You can also check which image this is based on AugmentedImage.getName(). when (img.index) { dogIndex -> TODO("Render a 3D version of a dog at img.getCenterPose()") catIndex -> TODO("Render a 3D version of a cat at img.getCenterPose()") } } }
การรองรับกรณีการใช้งานต่างๆ
เมื่อ ARCore ตรวจพบรูปภาพเสริม ระบบจะสร้าง Trackable
สำหรับข้อมูลดังกล่าว
รูปภาพเสริมและชุด TrackingState
ถึง TRACKING
และ TrackingMethod
ถึง FULL_TRACKING
เมื่อรูปภาพที่ติดตามย้ายออกจากมุมมองกล้อง ARCore
เปลี่ยน TrackingMethod
ไปยัง LAST_KNOWN_POSE
ขณะที่ยังคงระบุการวางแนวและตำแหน่งของ
รูปภาพ
แอปของคุณควรใช้การแจกแจงเหล่านี้แตกต่างกันไปตามกรณีการใช้งานที่ต้องการ
รูปภาพแบบคงที่ กรณีการใช้งานส่วนใหญ่ที่เกี่ยวข้องกับรูปภาพซึ่งยึดอยู่กับที่ (ซึ่งไม่คาดว่าจะย้าย) สามารถใช้
TrackingState
เพื่อกำหนด มีการตรวจพบรูปภาพหรือไม่ และทราบตำแหน่งของรูปภาพหรือไม่ ไม่สนใจTrackingMethod
ได้รูปภาพเคลื่อนไหว หากแอปของคุณต้องติดตามภาพเคลื่อนไหว ให้ใช้ทั้ง 2 อย่าง
TrackingState
และTrackingMethod
เพื่อระบุว่ารูปภาพนั้นได้รับ และตรวจพบตำแหน่งหรือไม่
กรณีการใช้งาน | รูปภาพแบบคงที่ | รูปภาพเคลื่อนไหว |
---|---|---|
ตัวอย่าง | โปสเตอร์แขวนบนผนัง | โฆษณาด้านข้างรถเมล์ |
ท่าโพสจะ ถือว่าถูกต้องเมื่อ |
TrackingState == TRACKING |
TrackingState == TRACKING
และ TrackingMethod == FULL_TRACKING
|
ดูเพิ่มเติม
โปรเจ็กต์ตัวอย่างของภาพความจริงเสริมใน ARCore SDK