Panduan developer Gambar Augmented untuk Android

Pelajari cara menggunakan Gambar Augmented di aplikasi Anda sendiri.

Prasyarat

Pastikan Anda memahami konsep dasar AR dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.

Membuat database gambar

Setiap database gambar dapat menyimpan informasi hingga 1.000 gambar.

Ada dua cara untuk membuat AugmentedImageDatabase:

  • Memuat database gambar yang tersimpan. Kemudian, (opsional) tambahkan gambar referensi lainnya.
  • Buat database baru yang kosong. Kemudian tambahkan gambar referensi satu per satu.

Memuat database gambar yang tersimpan

Gunakan AugmentedImageDatabase.deserialize() untuk memuat database gambar yang ada:

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

Database gambar dapat dibuat menggunakan arcoreimg selama pengembangan, atau dengan memanggil AugmentedImageDatabase.serialize() pada {i>database<i} yang dimuat di memori.

Membuat database kosong baru

Untuk membuat database gambar kosong saat runtime, gunakan konstruktor AugmentedImageDatabase:

Java

AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);

Kotlin

val imageDatabase = AugmentedImageDatabase(session)

Menambahkan gambar ke database yang ada

Tambahkan gambar ke database gambar dengan memanggil AugmentedImageDatabase.addImage() untuk setiap gambar, dengan menentukan widthInMeters opsional.

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)

Indeks yang dikembalikan nantinya dapat digunakan untuk mengidentifikasi gambar referensi mana yang terdeteksi.

Aktifkan pelacakan gambar

Konfigurasi sesi ARCore untuk mulai melacak gambar dengan mengatur sesi ke konfigurasi yang sudah dikonfigurasi dengan database gambar yang diinginkan:

Java

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

Kotlin

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

Selama sesi berlangsung, ARCore mencari gambar dengan mencocokkan poin fitur dari dengan gambar yang ada dalam database gambar.

Untuk mendapatkan gambar yang cocok, cari AugmentedImage yang diperbarui di loop pembaruan frame.

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

Mendukung berbagai kasus penggunaan

Saat mendeteksi Gambar Augmented, ARCore akan membuat Trackable untuk gambar tersebut Gambar Augmented dan kumpulan TrackingState ke TRACKING dan TrackingMethod ke FULL_TRACKING. Saat gambar yang dilacak bergerak keluar dari tampilan kamera, ARCore mengubah TrackingMethod ke LAST_KNOWN_POSE sambil terus memberikan orientasi dan posisi gambar tersebut.

Aplikasi Anda harus menggunakan enumerasi ini secara berbeda, bergantung pada penggunaan yang dimaksudkan ini masalahnya atau bukan.

  • Gambar tetap. Sebagian besar kasus penggunaan yang melibatkan gambar yang sudah diperbaiki (yaitu, tidak diperkirakan akan berpindah) cukup menggunakan TrackingState untuk menentukan apakah gambar telah terdeteksi dan apakah lokasinya diketahui atau tidak. TrackingMethod dapat diabaikan.

  • Gambar bergerak. Jika aplikasi Anda perlu melacak gambar bergerak, gunakan keduanya TrackingState dan TrackingMethod untuk menentukan apakah gambar telah terdeteksi dan apakah posisinya diketahui.

Kasus penggunaan Gambar tetap Gambar bergerak
Contoh Sebuah poster digantung di dinding Iklan di sisi bus
Posenya bisa
dianggap valid saat
TrackingState == TRACKING TrackingState == TRACKING
dan TrackingMethod == FULL_TRACKING

Lihat juga