Entwicklerleitfaden für Augmented Images für Android

Erfahren Sie, wie Sie Augmented Images in Ihren eigenen Apps verwenden.

Voraussetzungen

Stellen Sie sicher, dass Sie die grundlegenden AR-Konzepte und die Konfiguration einer ARCore-Sitzung verstehen, bevor Sie fortfahren.

Erstellen Sie eine Bilddatenbank

Jede Bilddatenbank kann Informationen für bis zu 1.000 Bilder speichern.

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

  • Laden einer gespeicherten Bilddatenbank . Fügen Sie dann optional weitere Referenzbilder hinzu.
  • Erstellen Sie eine neue leere Datenbank . Fügen Sie dann nacheinander Referenzbilder hinzu.

Laden Sie eine gespeicherte Bilddatenbank

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 mit dem arcoreimg während der Entwicklung oder durch Aufrufen von AugmentedImageDatabase.serialize() für eine Datenbank erstellt werden, die enthält, was im Arbeitsspeicher geladen ist.

Erstellen Sie eine neue leere Datenbank

Um zur Laufzeit eine leere Bilddatenbank zu erstellen, verwenden Sie den AugmentedImageDatabase -Konstruktor :

Java

AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);

Kotlin

val imageDatabase = AugmentedImageDatabase(session)

Bilder zu einer bestehenden Datenbank hinzufügen

Fügen Sie Bilder zu Ihrer Bilddatenbank hinzu, indem Sie AugmentedImageDatabase.addImage() für jedes Bild aufrufen und optional 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)

Die zurückgegebenen Indizes können später verwendet werden, um zu identifizieren, welches Referenzbild erkannt wurde.

Bildverfolgung aktivieren

Konfigurieren Sie Ihre ARCore-Sitzung, um mit der Verfolgung von Bildern zu beginnen, indem Sie die Sitzungskonfiguration auf eine Konfiguration setzen, 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 Merkmalspunkte aus dem Kamerabild mit denen in der Bilddatenbank abgleicht.

Um die übereinstimmenden Bilder zu erhalten, fragen Sie in Ihrer Rahmenaktualisierungsschleife nach aktualisierten AugmentedImage s 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, erstellt es ein Trackable für dieses erweiterte Bild und setzt TrackingState auf TRACKING und TrackingMethod auf FULL_TRACKING . Wenn sich das verfolgte Bild aus der Kameraansicht bewegt, ändert ARCore die TrackingMethod in LAST_KNOWN_POSE , während es weiterhin die Ausrichtung und Position des Bildes bereitstellt.

Ihre App sollte diese Aufzählungen je nach beabsichtigtem Anwendungsfall unterschiedlich verwenden.

  • Feste Bilder . Die meisten Anwendungsfälle mit Bildern, die an Ort und Stelle fixiert sind (d. h. von denen nicht erwartet wird, dass sie sich bewegen), können TrackingState einfach verwenden, um festzustellen, ob das Bild erkannt wurde und ob seine Position bekannt ist. TrackingMethod kann ignoriert werden.

  • Bewegte Bilder . Wenn Ihre App ein bewegtes Bild nachverfolgen muss, verwenden Sie TrackingState und TrackingMethod , um zu bestimmen, ob das Bild erkannt wurde und ob seine Position bekannt ist.

Anwendungsfall Festes Bild Bewegendes Bild
Beispiel An einer Wand hing ein Plakat Eine Werbung an der Seite eines Busses
Die Pose kann sein
gültig wann
TrackingState == TRACKING TrackingState == TRACKING
und
TrackingMethod == FULL_TRACKING