Android के लिए, ऑगमेंटेड इमेज डेवलपर गाइड

अपने ऐप्लिकेशन में ऑगमेंटेड इमेज को इस्तेमाल करने का तरीका जानें.

ज़रूरी बातें

पक्का करें कि आपको बुनियादी एआर (ऑगमेंटेड रिएलिटी) कॉन्सेप्ट की समझ है. साथ ही, आगे बढ़ने से पहले एआरकोर सेशन को कॉन्फ़िगर करने का तरीका जानें.

इमेज का डेटाबेस बनाना

हर इमेज डेटाबेस में ज़्यादा से ज़्यादा 1,000 इमेज की जानकारी सेव की जा सकती है.

AugmentedImageDatabase बनाने के दो तरीके हैं:

  • सेव की गई इमेज का डेटाबेस लोड करें. इसके बाद, वैकल्पिक रूप से ज़्यादा रेफ़रंस इमेज जोड़ें.
  • नया खाली डेटाबेस बनाना. इसके बाद, एक बार में एक ही इमेज जोड़ें.

सेव की गई इमेज का डेटाबेस लोड करना

किसी मौजूदा इमेज डेटाबेस को लोड करने के लिए, AugmentedImageDatabase.deserialize() का इस्तेमाल करें:

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)
}

इमेज के डेटाबेस बनाने के लिए, आप arcoreimg कमांड लाइन टूल का इस्तेमाल कर सकते हैं. इसके अलावा, आप डेटाबेस में AugmentedImageDatabase.serialize() कॉल करके भी ऐसा कर सकते हैं. यह डेटाबेस, मेमोरी में लोड होता है.

नया खाली डेटाबेस बनाना

रनटाइम के दौरान खाली इमेज डेटाबेस बनाने के लिए, AugmentedImageDatabase कंस्ट्रक्टर का इस्तेमाल करें:

Java

AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);

Kotlin

val imageDatabase = AugmentedImageDatabase(session)

किसी मौजूदा डेटाबेस में इमेज जोड़ना

हर इमेज के लिए AugmentedImageDatabase.addImage() पर कॉल करके, इमेज डेटाबेस में इमेज जोड़ें. यह जानकारी देने के लिए कोई वैकल्पिक widthInMeters बताएं.

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)

बाद में दिखाए गए इंडेक्स का इस्तेमाल यह पहचानने के लिए किया जा सकता है कि किस पहचान इमेज का पता लगाया गया था.

इमेज ट्रैकिंग चालू करें

पसंद के डेटाबेस के साथ कॉन्फ़िगर किए गए सेशन कॉन्फ़िगरेशन को सेट करके, इमेज को ट्रैक करने के लिए अपने ARCore सेशन को कॉन्फ़िगर करें:

Java

Config config = new Config(session);
config.setAugmentedImageDatabase(imageDatabase);
session.configure(config);

Kotlin

val config = Config(session)
config.augmentedImageDatabase = imageDatabase
session.configure(config)

सत्र के दौरान, ARCore कैमरे की इमेज से फ़ीचर पॉइंट का मिलान इमेज डेटाबेस में मौजूद इमेज से करके इमेज ढूंढता है.

मेल खाने वाली इमेज पाने के लिए, अपने फ़्रेम अपडेट होने वाले लूप में AugmentedImage का अपडेट करें.

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()")
    }
  }
}

इस्तेमाल के अलग-अलग तरीकों को बढ़ावा देना

जब ARCore को किसी ऑगमेंटेड इमेज का पता चलता है, तो वह उस ऑगमेंटेड इमेज के लिए एक Trackable बनाती है और TrackingState को TRACKING और TrackingMethod को FULL_TRACKING पर सेट करती है. ट्रैक की गई इमेज जब कैमरा व्यू से बाहर निकल जाती है, तो ARCore TrackingMethod को LAST_KNOWN_POSE में बदल देता है. साथ ही, यह इमेज की ओरिएंटेशन और स्थिति की जानकारी देता रहता है.

आपके ऐप्लिकेशन को इन गिनती का इस्तेमाल, इस्तेमाल के हिसाब से अलग-अलग होना चाहिए.

  • तय की गई इमेज. ज़्यादातर इस्तेमाल के ऐसे मामलों में, TrackingState का इस्तेमाल करके यह तय किया जा सकता है कि इमेज का पता लगा है या नहीं. साथ ही, यह भी पता लगा सकता है कि इसकी जगह की जानकारी है या नहीं. ऐसी इमेज की जगह तय नहीं होती है (यानी जिनकी जगह नहीं बदली जा सकती). TrackingMethod को अनदेखा किया जा सकता है.

  • इमेज को एक जगह से दूसरी जगह ले जाना. अगर आपके ऐप्लिकेशन को किसी मोशन इमेज को ट्रैक करने की ज़रूरत है, तो TrackingState और TrackingMethod का इस्तेमाल करके यह पता लगाएं कि इमेज का पता चला है या नहीं. साथ ही, यह पता लगा लें कि इमेज की स्थिति पता चलती है या नहीं.

इस्तेमाल का उदाहरण तय की गई इमेज इमेज की जगह बदली जा रही है
उदाहरण दीवार पर लटकता हुआ पोस्टर बस के पास मौजूद एक विज्ञापन
मुद्रा को
मान्य माना जा सकता है, जब
TrackingState == TRACKING TrackingState == TRACKING
और
TrackingMethod == FULL_TRACKING

इन्हें भी देंखे