تعرَّف على كيفية استخدام ميزة "الصور المعزَّزة" في تطبيقاتك.
المتطلبات الأساسية
احرص على فهم مفاهيم الواقع المعزّز الأساسية. وكيفية ضبط جلسة ARCore قبل المتابعة.
إنشاء قاعدة بيانات للصور
يمكن لكل قاعدة بيانات للصور تخزين معلومات لما يصل إلى 1,000 صورة.
هناك طريقتان لإنشاء
AugmentedImageDatabase
:
- تحميل قاعدة بيانات صور محفوظة يمكنك بعد ذلك إضافة المزيد من الصور المرجعية.
- إنشاء قاعدة بيانات جديدة فارغة بعد ذلك، أضِف الصور المرجعية واحدة تلو الأخرى.
تحميل قاعدة بيانات صور محفوظة
استخدام 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
لتحديد ما إذا كانت الصورة ما إذا كان موضعه معروفًا أم لا.
حالة الاستخدام | صورة ثابتة | جارٍ تحريك الصورة |
---|---|---|
مثال | ملصق معلّق على الحائط | إعلان على جانب حافلة |
الوضعية يمكن أن تكون تُعد صالحة في حالة |
TrackingState == TRACKING |
TrackingState == TRACKING
و TrackingMethod == FULL_TRACKING
|
انظر أيضًا
نماذج المشاريع الخاصة بالصور المُعزَّزة في ARCore SDK.