Руководство разработчика дополненных изображений для Android

Узнайте, как использовать дополненные изображения в своих приложениях.

Предварительные условия

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

См. также