了解如何在自己的应用程序中使用增强图像。
先决条件
在继续之前,请确保您了解基本的AR概念以及如何配置ARCore会话。
创建一个图像数据库
每个图像数据库最多可以存储1,000张图像的信息。加载保存的图像数据库。然后,可选地添加更多参考图像。
创建一个新的空数据库。然后一次添加一个参考图像。
加载保存的图像数据库
爪哇InputStream inputStream = context.getAssets().open("example.imgdb");
AugmentedImageDatabase imageDatabase = AugmentedImageDatabase.deserialize(session, inputStream);科特林val imageDatabase = context.assets.open("example.imgdb").use {
AugmentedImageDatabase.deserialize(session, it)
}
可以在开发过程中使用arcoreimg命令行工具创建图像数据库,也可以在包含已加载到内存中的数据库上调用AugmentedImageDatabase.serialize()来创建图像数据库。
创建一个新的空数据库
爪哇第076章科特林val imageDatabase = AugmentedImageDatabase(session);
将图像添加到现有数据库
通过为每个图像调用AugmentedImageDatabase.addImage() ,并指定一个可选的widthInMeters ,将图像添加到图像数据库。
爪哇Bitmap bitmap;
try (InputStream inputStream = getAssets().open("dog.jpg")) {
bitmap = BitmapFactory.decodeStream(inputStream);
} catch (IOException e) {
Log.e(TAG, "I/O exception loading augmented image bitmap.", e);
}
int index = imageDatabase.addImage("dog", bitmap, imageWidthInMeters);科特林val bitmap = assets.open("dog.jpg").use { BitmapFactory.decodeStream(it) }
val index = 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 。
爪哇// Update loop, in onDrawFrame().
Frame frame = session.update();
Collection 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;
}
// 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().
}
}
}科特林// Update loop, in onDrawFrame().
val frame = session.update()
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.
}
}
// 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 == TRACKINGTrackingState == TRACKING
和
TrackingMethod == FULL_TRACKING注意:如果相机视图中的图像非常快地变为尺寸和位置大致相同的第二个图像,则ARCore可能会错误地将两个图像的TrackingMethod设置为FULL_TRACKING ,并将第一FULL_TRACKING图像的锚点更新为新的形象。例如,如果您将相机对准Web浏览器中的图像,然后切换到另一个浏览器选项卡,其中包含第二个尺寸和位置相似的图像,则可能会发生这种情况。