ดูวิธีใช้ Augmented Images ในแอปของคุณเอง
ข้อกำหนดเบื้องต้น
ตรวจสอบว่าคุณเข้าใจแนวคิด 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
ได้รูปภาพเคลื่อนไหว หากแอปต้องติดตามภาพเคลื่อนไหว ให้ใช้ทั้ง
TrackingState
และTrackingMethod
เพื่อระบุว่ารูปภาพมีการตรวจจับหรือไม่และทราบตำแหน่งหรือไม่
Use Case | รูปภาพคงที่ | กำลังย้ายรูปภาพ |
---|---|---|
ตัวอย่าง | โปสเตอร์ที่แขวนบนผนัง | โฆษณาข้างรถเมล์ |
ท่าทางจะถือว่าถูกต้อง |
TrackingState == TRACKING |
TrackingState == TRACKING
และ TrackingMethod == FULL_TRACKING
|
ดูเพิ่มเติม
โปรเจ็กต์ตัวอย่าง Augmented Images ใน ARCore SDK