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 deTrackingMethod
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:
ARCore SDK'sındaki Genişletilmiş Görüntüler örnek projeleri.