Узнайте, как использовать дополненные изображения в своих приложениях.
Предварительные условия
Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции 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.