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

Temel artırılmış gerçeklik kavramlarını anladığınızdan emin olun ve devam etmeden önce ARCore oturumunun nasıl yapılandırılacağı hakkında daha fazla bilgi edinin.

Görüntü 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 görüntü veritabanı yükleyin. Ardından isteğe bağlı olarak daha fazla referans resim ekleyebilirsiniz.
  • Yeni boş bir veritabanı oluşturun. Ardından referans görüntüleri teker teker 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 görüntü 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

Ş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 görüntüsünün algılandı.

Resim izlemeyi etkinleştir

Oturumu ayarlayarak ARCore oturumunuzu resimleri izlemeye başlayacak şekilde yapılandırın istediğiniz 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 görmek için kare güncelleme döngünüzdeki güncellenmiş AugmentedImageları arayı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, Artırılmış Resim algıladığında bunun için bir Trackable oluşturur Genişletilmiş Resim ve TrackingState kümeleri TRACKING ve TrackingMethod FULL_TRACKING arasında. Takip edilen resim kamera görünümünün dışına çıktığında ARCore, TrackingMethod değerini değiştirir yön ve konumunu sağlamaya devam ederken LAST_KNOWN_POSE'e resim.

Uygulamanız, kullanım amacına bağlı olarak bu numaralandırmaları farklı şekilde kullanmalıdır. dava açın.

  • Sabit resimler. Yerlerine sabitlenmiş resimler içeren çoğu kullanım alanı (taşınması beklenmeyen) basitçe TrackingState kullanarak resmin algılanıp algılanmadığı ve konumunun bilinip bilinmediği. TrackingMethod yoksayılabilir.

  • Hareketli resimler. Uygulamanızın hareketli bir resmi izlemesi gerekiyorsa her ikisini de kullanın Resmin yüksek olup olmadığını belirlemek için TrackingState ve TrackingMethod ve konumunun bilinip bilinmediği.

Kullanım alanı Düzeltilen resim Resim taşınıyor
Örnek Duvara asılı 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: