Entwicklerleitfaden für erweiterte Bilder für Android

Hier erfahren Sie, wie Sie erweiterte Bilder in Ihren eigenen Apps verwenden.

Voraussetzungen

Machen Sie sich mit den grundlegenden AR-Konzepten und zur Konfiguration einer ARCore-Sitzung vertraut, bevor Sie fortfahren.

Bilddatenbank erstellen

In jeder Bilddatenbank können Informationen für bis zu 1.000 Bilder gespeichert werden.

Es gibt zwei Möglichkeiten, einen AugmentedImageDatabase zu erstellen:

  • Gespeicherte Bilddatenbank laden Fügen Sie dann optional weitere Referenzbilder hinzu.
  • Erstellen Sie eine neue leere Datenbank. Fügen Sie dann nacheinander Referenzbilder hinzu.

Gespeicherte Bilddatenbank laden

Verwenden Sie AugmentedImageDatabase.deserialize(), um eine vorhandene Bilddatenbank zu laden:

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)
}

Bilddatenbanken können während der Entwicklung mit dem arcoreimg-Befehlszeilentool oder durch Aufrufen von AugmentedImageDatabase.serialize() für eine Datenbank erstellt werden, die in den Arbeitsspeicher geladen ist.

Neue leere Datenbank erstellen

Verwenden Sie den AugmentedImageDatabase-Konstruktor, um zur Laufzeit eine leere Bilddatenbank zu erstellen:

Java

AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);

Kotlin

val imageDatabase = AugmentedImageDatabase(session)

Bilder zu einer vorhandenen Datenbank hinzufügen

Sie können Ihrer Bilddatenbank Bilder hinzufügen. Rufen Sie dazu für jedes Bild AugmentedImageDatabase.addImage() auf und geben Sie einen optionalen widthInMeters an.

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)

Anhand der zurückgegebenen Indexe kann später ermittelt werden, welches Referenzbild erkannt wurde.

Bild-Tracking aktivieren

Konfigurieren Sie Ihre ARCore-Sitzung für das Tracking von Bildern. Legen Sie dazu die Sitzungskonfiguration auf eine Konfiguration fest, die mit der gewünschten Bilddatenbank konfiguriert ist:

Java

Config config = new Config(session);
config.setAugmentedImageDatabase(imageDatabase);
session.configure(config);

Kotlin

val config = Config(session)
config.augmentedImageDatabase = imageDatabase
session.configure(config)

Während der Sitzung sucht ARCore nach Bildern, indem es Featurepunkte auf dem Kamerabild mit denen in der Bilddatenbank vergleicht.

Um übereinstimmende Bilder zu erhalten, fragen Sie in der Frame-Update-Schleife nach aktualisierten AugmentedImage-Elementen ab.

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()")
    }
  }
}

Unterstützung verschiedener Anwendungsfälle

Wenn ARCore ein erweitertes Bild erkennt, wird ein Trackable dafür erstellt und TrackingState auf TRACKING und TrackingMethod auf FULL_TRACKING gesetzt. Wenn sich das erfasste Bild aus dem Sichtfeld der Kamera bewegt, ändert ARCore TrackingMethod in LAST_KNOWN_POSE und stellt weiterhin die Ausrichtung und Position des Bilds bereit.

Je nach beabsichtigtem Anwendungsfall sollte diese Aufzählungen in Ihrer App unterschiedlich verwendet werden.

  • Behobene Bilder: In den meisten Anwendungsfällen, in denen Bilder an Ort und Stelle fixiert sind (also nicht verschoben werden sollen), kann einfach mit TrackingState ermittelt werden, ob das Bild erkannt wurde und ob sein Standort bekannt ist. TrackingMethod kann ignoriert werden.

  • Bilder verschieben: Wenn Ihre Anwendung ein sich bewegendes Bild verfolgen muss, verwenden Sie sowohl TrackingState als auch TrackingMethod, um festzustellen, ob das Bild erkannt wurde und ob seine Position bekannt ist.

Anwendungsfall Fixiertes Bild Bild wird verschoben
Beispiel Ein an einer Wand hängendes Plakat Anzeige an der Seite eines Busses
Die Pose kann
als gültig angesehen werden, wenn
TrackingState == TRACKING TrackingState == TRACKING
und
TrackingMethod == FULL_TRACKING

Weitere Informationen