راهنمای برنامه نویس تصاویر افزوده برای اندروید

یاد بگیرید که چگونه از تصاویر افزوده شده در برنامه های خود استفاده کنید.

پیش نیازها

قبل از ادامه، مطمئن شوید که مفاهیم اساسی AR و نحوه پیکربندی یک جلسه ARCore را درک کرده اید.

یک پایگاه داده تصویر ایجاد کنید

هر پایگاه داده تصویر می تواند اطلاعات تا 1000 تصویر را ذخیره کند.

دو راه برای ایجاد یک AugmentedImageDatabase وجود دارد:

  • پایگاه داده تصویر ذخیره شده را بارگیری کنید . سپس به صورت اختیاری تصاویر مرجع بیشتری اضافه کنید.
  • یک پایگاه داده خالی جدید ایجاد کنید . سپس تصاویر مرجع را یکی یکی اضافه کنید.

پایگاه داده تصویر ذخیره شده را بارگیری کنید

از AugmentedImageDatabase.deserialize() برای بارگذاری پایگاه داده تصویر موجود استفاده کنید:

جاوا

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

کاتلین

val imageDatabase = this.assets.open("example.imgdb").use {
  AugmentedImageDatabase.deserialize(session, it)
}

پایگاه داده های تصویر را می توان با استفاده از ابزار خط فرمان arcoreimg در حین توسعه ایجاد کرد، یا با فراخوانی AugmentedImageDatabase.serialize() روی پایگاه داده ای که حاوی آن در حافظه بارگذاری شده است، ایجاد کرد.

یک پایگاه داده خالی جدید ایجاد کنید

برای ایجاد یک پایگاه داده تصویر خالی در زمان اجرا، از سازنده AugmentedImageDatabase استفاده کنید:

جاوا

AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);

کاتلین

val imageDatabase = AugmentedImageDatabase(session)

افزودن تصاویر به پایگاه داده موجود

با فراخوانی AugmentedImageDatabase.addImage() برای هر تصویر، با مشخص کردن یک widthInMeters اختیاری، تصاویر را به پایگاه داده تصویر خود اضافه کنید.

جاوا

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

کاتلین

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 خود را برای شروع ردیابی تصاویر با تنظیم پیکربندی جلسه روی پیکربندی که با پایگاه داده تصویر مورد نظر پیکربندی شده است، پیکربندی کنید:

جاوا

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

کاتلین

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

در طول جلسه، ARCore با تطبیق نقاط ویژگی از تصویر دوربین با موارد موجود در پایگاه داده تصویر، به دنبال تصاویر می‌گردد.

برای دریافت تصاویر منطبق، برای AugmentedImage به روز شده در حلقه به روز رسانی قاب خود نظرسنجی کنید.

جاوا

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

کاتلین

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

همچنین ببینید