یاد بگیرید که چگونه از تصاویر افزوده شده در برنامه های خود استفاده کنید.
پیش نیازها
قبل از ادامه، مطمئن شوید که مفاهیم اساسی AR و نحوه پیکربندی یک جلسه ARCore را درک کرده اید.
یک پایگاه داده تصویر ایجاد کنید
هر پایگاه داده تصویر می تواند اطلاعات تا 1000 تصویر را ذخیره کند.
دو راه برای ایجاد یک AugmentedImageDatabase
وجود دارد:
- پایگاه داده تصویر ذخیره شده را بارگیری کنید . سپس به صورت اختیاری تصاویر مرجع بیشتری اضافه کنید.
- یک پایگاه داده خالی جدید ایجاد کنید . سپس تصاویر مرجع را یکی یکی اضافه کنید.
پایگاه داده تصویر ذخیره شده را بارگیری کنید
از AugmentedImageDatabase.deserialize()
برای بارگذاری پایگاه داده تصویر موجود استفاده کنید:
جاوا
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. }
کاتلین
val imageDatabase = this.assets.open("example.imgdb").use { AugmentedImageDatabase.deserialize(session, it) }
پایگاه داده های تصویر را می توان با استفاده از ابزار خط فرمان arcoreimg
در حین توسعه ایجاد کرد، یا با فراخوانی AugmentedImageDatabase.serialize()
روی پایگاه داده ای که حاوی آن در حافظه بارگذاری شده است، ایجاد کرد.
یک پایگاه داده خالی جدید ایجاد کنید
برای ایجاد یک پایگاه داده تصویر خالی در زمان اجرا، از سازنده AugmentedImageDatabase
استفاده کنید:
جاوا
AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);
کاتلین
val imageDatabase = AugmentedImageDatabase(session)
افزودن تصاویر به پایگاه داده موجود
با فراخوانی AugmentedImageDatabase.addImage()
برای هر تصویر، با مشخص کردن یک widthInMeters
اختیاری، تصاویر را به پایگاه داده تصویر خود اضافه کنید.
جاوا
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);
کاتلین
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 خود را برای شروع ردیابی تصاویر با تنظیم پیکربندی جلسه روی پیکربندی که با پایگاه داده تصویر مورد نظر پیکربندی شده است، پیکربندی کنید:
جاوا
Config config = new Config(session); config.setAugmentedImageDatabase(imageDatabase); session.configure(config);
کاتلین
val config = Config(session) config.augmentedImageDatabase = imageDatabase session.configure(config)
در طول جلسه، ARCore با تطبیق نقاط ویژگی از تصویر دوربین با موارد موجود در پایگاه داده تصویر، به دنبال تصاویر میگردد.
برای دریافت تصاویر منطبق، برای AugmentedImage
به روز شده در حلقه به روز رسانی قاب خود نظرسنجی کنید.
جاوا
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(). } } }
کاتلین
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.