Tìm hiểu cách sử dụng Hình ảnh tăng cường trong ứng dụng của riêng bạn.
Điều kiện tiên quyết
Hãy đảm bảo rằng bạn hiểu các khái niệm cơ bản về AR và cách định cấu hình 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 đó, bạn có thể thêm hình ảnh tham khảo khác (không bắt buộc).
- Tạo cơ sở dữ liệu trống mới. Sau đó, hãy thêm từng hình ảnh tham khảo.
Tải cơ sở dữ liệu hình ảnh đã lưu
Sử dụng AugmentedImageDatabase.deserialize()
để tải cơ sở dữ liệu hình ảnh hiện có:
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) }
Bạn có thể tạo cơ sở dữ liệu hình ảnh bằng công cụ dòng lệnh arcoreimg
trong quá trình phát triển hoặc bằng cách gọi AugmentedImageDatabase.serialize()
trên cơ sở dữ liệu chứa dữ liệu được tải trong bộ nhớ.
Tạo cơ sở dữ liệu trống mới
Để tạo cơ sở dữ liệu hình ảnh trống trong thời gian chạy, hãy sử dụng hàm khởi tạo AugmentedImageDatabase
:
AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);
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 bằng cách gọi AugmentedImageDatabase.addImage()
cho mỗi hình ảnh, chỉ định widthInMeters
không bắt buộc.
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)
Sau này, 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 một cấu hình được định cấu hình bằng cơ sở dữ liệu hình ảnh mong muốn:
Config config = new Config(session); config.setAugmentedImageDatabase(imageDatabase); session.configure(config);
val config = Config(session) config.augmentedImageDatabase = imageDatabase session.configure(config)
Trong phiên này, ARCore tìm kiếm hình ảnh bằng cách so khớp các điểm đặc trưng từ hình ảnh của máy ảnh với các điểm đặc trưng trong cơ sở dữ liệu hình ảnh.
Để nhận hình ảnh đã so khớp, hãy thăm dò ý kiến về AugmentedImage
đã cập nhật trong vòng lặp cập nhật khung hình.
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()") } } }
Hỗ trợ nhiều trường hợp sử dụng
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 TRACKING
và TrackingMethod
thành FULL_TRACKING
. Khi hình ảnh được theo dõi di chuyển ra khỏi khung hình máy ảnh, ARCore sẽ thay đổi TrackingMethod
thành LAST_KNOWN_POSE
trong khi 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ác enum này theo cách khác nhau tuỳ thuộc vào trường hợp sử dụng dự kiến.
Sửa hình ảnh. Hầu hết các trường hợp sử dụng liên quan đến hình ảnh cố định tại chỗ (tức là không di chuyển) chỉ cần sử dụng
TrackingState
để xác định xem hình ảnh đã được phát hiện hay chưa và vị trí của hình ảnh đó có được biết hay không. Bạn có thể bỏ quaTrackingMethod
.Hình ảnh chuyển động. Nếu ứng dụng của bạn cần theo dõi hình ảnh chuyển động, hãy sử dụng cả
TrackingState
vàTrackingMethod
để xác định xem hình ảnh đã được phát hiện hay chưa và liệu vị trí của hình ảnh có được biết hay không.
Trường hợp sử dụng | Hình ảnh đã sửa | Hình ảnh động |
---|---|---|
Ví dụ: | Một tấm áp phích treo trên tường | Quảng cáo ở bên hông xe buýt |
Tư thế có thể được coi là hợp lệ khi |
TrackingState == TRACKING |
TrackingState == TRACKING
và TrackingMethod == FULL_TRACKING
|
Xem thêm
Dự án mẫu về Hình ảnh tăng cường trong SDK ARCore.