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