Android için Genişletilmiş Resimler geliştirici kılavuzu

Artırılmış resimleri kendi uygulamalarınızda nasıl kullanacağınızı öğrenin.

Ön koşullar

Devam etmeden önce temel AR kavramlarını ve ARCore oturumunu nasıl yapılandıracağınızı anladığınızdan emin olun.

Resim veritabanı oluşturma

Her resim veritabanı en fazla 1.000 görüntü için bilgi depolayabilir.

AugmentedImageDatabase oluşturmanın iki yolu vardır:

  • Kayıtlı bir resim veritabanını yükleyin. Ardından isteğe bağlı olarak daha fazla referans resim ekleyebilirsiniz.
  • Yeni bir boş veritabanı oluşturun. Daha sonra referans resimleri tek tek ekleyin.

Kayıtlı bir resim veritabanını yükleme

Mevcut bir resim veritabanını yüklemek için AugmentedImageDatabase.deserialize() aracını kullanın:

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

Görüntü veritabanları, geliştirme sırasında arcoreimg komut satırı aracı kullanılarak veya belleğe yüklenmiş olan bir veritabanında AugmentedImageDatabase.serialize() çağrısı yapılarak oluşturulabilir.

Yeni bir boş veritabanı oluştur

Çalışma zamanında boş bir resim veritabanı oluşturmak için AugmentedImageDatabase oluşturucuyu kullanın:

Java

AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);

Kotlin

val imageDatabase = AugmentedImageDatabase(session)

Mevcut bir veritabanına görüntü ekleme

Her resim için AugmentedImageDatabase.addImage() yöntemini çağırarak resim veritabanınıza resim ekleyin ve isteğe bağlı bir widthInMeters belirtin.

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)

Döndürülen dizinler daha sonra hangi referans görüntünün algılandığını tanımlamak için kullanılabilir.

Resim izlemeyi etkinleştir

Oturum yapılandırmasını, istenen resim veritabanıyla yapılandırılmış bir yapılandırmaya ayarlayarak resimleri izlemeye başlamak için ARCore oturumunuzu yapılandırın:

Java

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

Kotlin

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

Oturum sırasında ARCore, kamera resmindeki özellik noktalarını resim veritabanındakilerle eşleştirerek görüntüleri arar.

Eşleşen resimleri almak için kare güncelleme döngünüzdeki güncellenmiş AugmentedImage için anket yapın.

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

Farklı kullanım alanlarını destekleme

ARCore bir artırılmış resim algıladığında bu artırılmış görüntü için bir Trackable oluşturup TrackingState değerini TRACKING, TrackingMethod değerini ise FULL_TRACKING olarak ayarlar. Takip edilen resim kamera görünümünden çıktığında ARCore, resmin yönünü ve konumunu sağlamaya devam ederken TrackingMethod değerini LAST_KNOWN_POSE olarak değiştirir.

Uygulamanızın bu numaralandırmaları kullanım amacına göre farklı şekillerde kullanması gerekir.

  • Sabit resimler. Sabitlenmiş (yani hareket etmesi beklenmeyen) görüntüleri içeren çoğu kullanım durumu, görüntünün algılanıp algılanmadığını ve konumunun bilinip bilinmediğini belirlemek için TrackingState özelliğini kullanabilir. TrackingMethod yoksayılabilir.

  • Hareketli resimler. Uygulamanızın hareketli bir görüntüyü izlemesi gerekiyorsa görüntünün algılanıp algılanmadığını ve konumunun bilinip bilinmediğini belirlemek için hem TrackingState hem de TrackingMethod kullanın.

Kullanım alanı Düzeltilmiş resim Resim taşınıyor
Örnek Duvara asılı poster Otobüsün yan tarafındaki reklam
Poz, şu durumlarda
geçerli kabul edilebilir:
TrackingState == TRACKING TrackingState == TRACKING
ve
TrackingMethod == FULL_TRACKING

Aşağıdaki kaynakları da incelemenizi öneririz: