Hướng dẫn dành cho nhà phát triển Hình ảnh tăng cường dành cho Android

Tìm hiểu cách sử dụng Hình ảnh tăng cường trong ứng dụng của chính bạn.

Điều kiện tiên quyết

Hãy đảm bảo bạn hiểu rõ các khái niệm cơ bản về Thực tế tăng cường và cách định cấu hình một phiên ARCore trước khi tiếp tục.

Tạo cơ sở dữ liệu hình ảnh

Mỗi cơ sở dữ liệu hình ảnh có thể lưu trữ thông tin cho tối đa 1.000 hình ảnh.

Có hai cách để tạo AugmentedImageDatabase:

  • Tải cơ sở dữ liệu hình ảnh đã lưu. Sau đó, tùy ý thêm hình ảnh tham chiếu khác.
  • Tạo cơ sở dữ liệu trống mới. Sau đó, lần lượt thêm từng ảnh tham chiếu.

Tải cơ sở dữ liệu hình ảnh đã lưu

Dùng AugmentedImageDatabase.deserialize() để tải cơ sở dữ liệu hình ảnh hiện có:

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

Bạn có thể tạo cơ sở dữ liệu hình ảnh bằng cách sử dụng công cụ dòng lệnh arcoreimg trong quá trình phát triển hoặc gọi AugmentedImageDatabase.serialize() trên cơ sở dữ liệu chứa nội dung này được tải trong bộ nhớ.

Tạo cơ sở dữ liệu trống mới

Để tạo một cơ sở dữ liệu hình ảnh trống vào thời gian chạy, hãy dùng hàm dựng AugmentedImageDatabase:

Java

AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);

Kotlin

val imageDatabase = AugmentedImageDatabase(session)

Thêm hình ảnh vào cơ sở dữ liệu hiện có

Thêm hình ảnh vào cơ sở dữ liệu hình ảnh của bạn bằng cách gọi AugmentedImageDatabase.addImage() cho mỗi hình ảnh, chỉ định một widthInMeters không bắt buộc.

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)

Sau đó, bạn có thể sử dụng các chỉ mục được trả về để xác định hình ảnh tham chiếu nào đã được phát hiện.

Bật tính năng theo dõi hình ảnh

Định cấu hình phiên ARCore để bắt đầu theo dõi hình ảnh bằng cách đặt cấu hình phiên thành cấu hình phiên được định cấu hình với cơ sở dữ liệu hình ảnh mong muốn:

Java

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

Kotlin

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

Trong phiên hoạt động này, ARCore tìm kiếm các hình ảnh bằng cách so khớp các điểm tính năng từ hình ảnh của máy ảnh với những hình ảnh đó trong cơ sở dữ liệu hình ảnh.

Để nhận được những hình ảnh phù hợp, hãy thăm dò ý kiến của AugmentedImage bạn đã cập nhật trong vòng lặp cập nhật khung hình.

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

Hỗ trợ các trường hợp sử dụng khác nhau

Khi phát hiện Hình ảnh tăng cường, ARCore sẽ tạo một Trackable cho Hình ảnh tăng cường đó và đặt TrackingState thành TRACKINGTrackingMethod thành FULL_TRACKING. Khi hình ảnh được theo dõi di chuyển ra khỏi chế độ xem máy ảnh, ARCore sẽ thay đổi TrackingMethod thành LAST_KNOWN_POSE trong khi vẫn tiếp tục cung cấp hướng và vị trí của hình ảnh.

Ứng dụng của bạn nên sử dụng cách đánh số này theo cách khác nhau, tùy thuộc vào trường hợp sử dụng dự kiến.

  • Hình ảnh cố định. Hầu hết các trường hợp sử dụng liên quan đến hình ảnh được cố định tại chỗ (tức là không dự kiến sẽ di chuyển) có thể chỉ cần sử dụng TrackingState để xác định hình ảnh đã được phát hiện hay chưa và có biết vị trí của hình ảnh hay không. Bạn có thể bỏ qua TrackingMethod.

  • Di chuyển hình ảnh. Nếu ứng dụng của bạn cần theo dõi một hình ảnh động, hãy sử dụng cả TrackingStateTrackingMethod để xác định xem hệ thống đã phát hiện thấy hình ảnh đó hay chưa và có biết vị trí của hình ảnh đó hay không.

Trường hợp sử dụng Hình ảnh cố định Đang di chuyển hình ảnh
Ví dụ: Áp phích được treo trên tường Quảng cáo bên cạnh xe buýt
Tư thế này có thể
được coi là hợp lệ khi
TrackingState == TRACKING TrackingState == TRACKING

TrackingMethod == FULL_TRACKING

Xem thêm