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

Artırılmış Görüntüleri 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 resim bilgisi 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 görseli ekleyin.
  • Yeni bir boş veritabanı oluşturun. Ardından referans görsellerini tek tek ekleyin.

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

Mevcut bir resim veritabanını yüklemek için AugmentedImageDatabase.deserialize() simgesini 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üklenen bir veritabanında AugmentedImageDatabase.serialize() çağrılarak oluşturulabilir.

Yeni boş veritabanı oluşturma

Ç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 resim ekleme

İsteğe bağlı bir widthInMeters belirterek her resim için AugmentedImageDatabase.addImage() işlevini çağırarak resim veritabanınıza resim ekleyin.

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

Resim izlemeyi etkinleştirme

Oturum yapılandırmasını, istenen resim veritabanı ile yapılandırılmış bir yapılandırma olarak ayarlayarak ARCore oturumunuzu resimleri izlemeye başlayacak şekilde 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)

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

Eşleşen resimleri almak için çerçeve güncelleme döngüsünüzde güncellenmiş AugmentedImage olup olmadığını kontrol edin.

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, amaçlanan kullanım alanına bağlı olarak bu listeleri farklı şekilde kullanmalıdır.

  • 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ı Sabit resim Resim taşınıyor
Örnek Duvara asılı bir poster Bir otobüsün yan tarafındaki reklam
Durum aşağıdaki durumlarda
geçerli olarak kabul edilebilir:
TrackingState == TRACKING TrackingState == TRACKING
ve
TrackingMethod == FULL_TRACKING

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