Entwicklerleitfaden für erweiterte Bilder für Android

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

Vorbereitung

Machen Sie sich mit den grundlegenden AR-Konzepten vertraut. und Konfigurieren einer ARCore-Sitzung beschrieben, bevor du fortfährst.

Bilddatenbank erstellen

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

Es gibt zwei Möglichkeiten, AugmentedImageDatabase:

  • Laden Sie eine gespeicherte Bilddatenbank. Fügen Sie dann optional weitere Referenzbilder hinzu.
  • Erstellen Sie eine neue leere Datenbank. Fügen Sie dann einzeln Referenzbilder hinzu.

Gespeicherte Bilddatenbank laden

AugmentedImageDatabase.deserialize() verwenden 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 der arcoreimg erstellt werden während der Entwicklung oder durch Aufrufen von AugmentedImageDatabase.serialize() in einer Datenbank, 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)

Einer vorhandenen Datenbank Bilder hinzufügen

Fügen Sie Ihrer Bilddatenbank Bilder hinzu, indem Sie folgenden Befehl aufrufen: AugmentedImageDatabase.addImage() für jedes Bild, wobei eine optionale widthInMeters angegeben wird.

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 lässt sich später ermitteln, welches Referenzbild erkannt.

Bild-Tracking aktivieren

Konfigurieren Sie Ihre ARCore-Sitzung, um mit dem Tracking von Bildern zu beginnen, indem Sie die Sitzung einrichten -Konfiguration in eine, die mit der gewünschten Image-Datenbank 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 Übung sucht ARCore nach Bildern, indem er Featurepunkte aus den Kamerabild mit denen in der Bilddatenbank vergleichen.

Um übereinstimmende Bilder zu erhalten, frage in der Frame-Update-Schleife nach aktualisierten AugmentedImages.

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

Verschiedene Anwendungsfälle unterstützen

Wenn ARCore ein erweitertes Bild erkennt, wird dafür ein Trackable erstellt. Erweitertes Bild und Gruppen TrackingState an TRACKING und TrackingMethod bis FULL_TRACKING. Wenn das Bild aus dem Sichtfeld der Kamera verschwindet, ARCore ändert den TrackingMethod auf LAST_KNOWN_POSE und es werden weiterhin die Ausrichtung und Position des auf das Bild.

Ihre App sollte diese Aufzählungen je nach Verwendungszweck unterschiedlich verwenden Fall.

  • Feste Bilder: Die meisten Anwendungsfälle umfassen Bilder, die an Ort und Stelle fixiert sind. (d. h., es wird nicht voraussichtlich verschoben) können einfach mit TrackingState bestimmen, ob das Bild erkannt wurde und ob sein Standort bekannt ist. TrackingMethod kann ignoriert werden.

  • Verschieben von Bildern: Wenn deine App ein bewegtes Bild erfassen muss, verwende beide TrackingState und TrackingMethod, um festzustellen, ob das Bild erkannt wird und ob seine Position bekannt ist.

Anwendungsfall Fixiertes Bild Bild wird verschoben
Beispiel Ein Poster an einer Wand Werbung an der Seite eines Busses
Die Position kann
als gültig angesehen, wenn
TrackingState == TRACKING TrackingState == TRACKING
und
TrackingMethod == FULL_TRACKING

Weitere Informationen