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ında en fazla 1.000 resme ait bilgi depolanabilir.

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

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

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

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

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ı arcoreimg kullanılarak oluşturulabilir komut satırı aracını kullanarak veya geliştirme sırasında AugmentedImageDatabase.serialize() içeren bir veritabanını kullanmaktır.

Yeni boş veritabanı oluştur

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

Java

AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);

Kotlin

val imageDatabase = AugmentedImageDatabase(session)

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

Şu komutu çağırarak resim veritabanınıza resim ekleyin: AugmentedImageDatabase.addImage() (isteğe bağlı bir widthInMeters belirterek her resim için).

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 resmin algılandığını belirlemek için kullanılabilir.

Resim izlemeyi etkinleştirme

Oturumu ayarlayarak resimleri izlemeye başlamak için ARCore oturumunuzu yapılandırın istenen resim veritabanıyla yapılandırılmış bir yapılandırma dosyası oluşturun:

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, oturumdaki özellik noktalarını eşleştirerek kamera görüntüsünü resim veritabanında bulunanlarla karşılaştırabilirsiniz.

Eşleşen resimleri almak için çerçeve güncelleme döngüsünüzde güncellenmiş AugmentedImage değerlerini sorgulayı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ış görüntü algıladığında bu artırılmış görüntü için bir Trackable oluşturur ve TrackingState değerini TRACKING, TrackingMethod değerini ise FULL_TRACKING olarak ayarlar. İzlenen resim kamera görüş alanından çı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, kullanım amacına bağlı olarak bu numaralandırmaları farklı şekilde kullanmalıdır. dava açın.

  • Sabit resimler. Yerine sabitlenmiş (yani hareket etmesinin beklenmediği) resimlerin yer aldığı çoğu kullanım alanında, resmin algılanıp algılanmadığını ve konumunun bilinip bilinmediğini belirlemek için TrackingState kullanılabilir. TrackingMethod yoksayılabilir.

  • Hareketli resimler. Uygulamanızın hareketli bir resmi izlemesi gerekiyorsa resmin 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üzeltilen resim Resim taşınıyor
Örnek Duvara asılı bir poster Otobüsün yanındaki reklam
Poz şöyle olabilir:
şu durumda geçerli kabul edilir:
TrackingState == TRACKING TrackingState == TRACKING.

TrackingMethod == FULL_TRACKING

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