Augmented Images 图像触发器详解
Augmented Images 是什么
Augmented Images(增强图像)让 ARCore 应用检测特定的 2D 图像并触发 AR 体验——扫描电影海报弹出角色动画、扫描产品包装叠加 3D 模型、扫描广告牌显示扩展信息等。
与传统图像识别方案(如 Vuforia、ARtoolKit)不同的是,Augmented Images 不需要开发者预先"扫描目标图像"建图——ARCore 在运行时自动从图像中提取特征点并匹配,简化了开发者流程。
工作原理
开发者流程:
准备目标图像 → 创建 Image Database → 放入 Session 配置 → 运行时自动检测
运行时流程:
每一帧摄像头画面 → 提取特征点 → 和数据库中的图像特征点匹配
↓
匹配成功 → 返回 AugmentedImage 对象
↓
在图像位置叠加 AR 内容
步骤一:准备目标图像
目标图像的质量直接影响检测精度:
| 要求 | 说明 |
|---|---|
| 清晰锐利 | 不能模糊、压缩、过曝 |
| 纹理丰富 | 有足够多的特征点(Logo、文字、图案等)——纯色大面积区域检测困难 |
| 扁平平面 | 图像本身是平面的(海报、包装盒、名片)——曲面(如杯子上的文字)检测能力有限 |
| 尺寸适中 | 建议物理尺寸至少 5cm × 5cm |
| 独特 | 与其他目标图像不相似(否则可能误匹配) |
图像格式
- 离线编译:PNG / JPG / JPEG / BMP / WebP
- 在线加载:同样格式
避免用纯文字、纯图形、纯色块的图像——特征点不够。
步骤二:创建 Image Database
两种方式创建数据库:
方式一:运行时动态创建(简单灵活)
session.configure(
Session.Config(context).apply {
// 创建新的空数据库
val database = AugmentedImageDatabase(session)
// 添加图像(可选:指定物理宽度,单位米)
database.addImage(
imageName = "poster_movie",
bitmap = yourBitmap,
widthInMeters = 0.5f // 海报实际宽度(米)——有助于精确估计距离
)
// 放入 Session 配置
setAugmentedImageDatabase(database)
}
)
方式二:离线预编译(性能更好)
用 arcoreimg 命令行工具编译图像数据库文件,然后打包进 APK:
# 在 Android SDK 目录中找到 arcoreimg
# 编译单个图像
arcoreimg buildimgdb \
--input_images_directory ./images/ \
--output_db_path ./assets/img_database.bin
然后在应用中加载:
// 从 assets 加载预编译数据库
val inputStream = context.assets.open("img_database.bin")
val database = AugmentedImageDatabase.deserialize(inputStream)
session.configure(
Session.Config(context).apply {
setAugmentedImageDatabase(database)
}
)
预编译数据库的优势:启动更快、内存更省、特征点提取质量更高。
数据库容量限制
| 参数 | 限制 |
|---|---|
| 单个数据库最大图像数 | 1,000 张 |
| 单个目标图像最大 | 约 10MB |
| 同时检测的最大图像数 | 由设备性能决定,通常 5~10 张 |
步骤三:运行时检测与触发
session.update(frame)
// 获取当前所有检测到的 Augmented Images
val detectedImages = session.getAllTrackables<AugmentedImage>()
detectedImages.forEach { image ->
when (image.trackingState) {
TrackingState.TRACKING -> {
// 图片稳定跟踪中,叠加 AR 内容
// image.name 返回的是数据库中注册的图像名
when (image.name) {
"poster_movie" -> {
// 在海报位置弹出角色动画
placeCharacterAnimation(image.centerPose)
}
"product_box" -> {
// 在包装盒上叠加 3D 模型
place3DModel(image.centerPose)
}
}
// image 提供了:
// image.centerPose: 中心位置和朝向
// image.extent: 图像的实际物理尺寸 [width, height]
// image.trackingMethod: 检测方式(IMAGE_TRACKING / FULL_TRACKING)
}
TrackingState.PAUSED -> {
// 暂时丢失(图像被遮挡或移出视野)
}
TrackingState.STOPPED -> {
// 彻底丢失,可以清理相关资源
}
}
}
移动图像跟踪
ARCore 还支持跟踪移动的图像(比如公交车身上的广告、用户手中挥动的海报)——即使图像移出视野后再回来也能继续跟踪。这由 ARCore 自动处理,开发者不需要额外配置。
Unity AR Foundation 中的用法
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class ImageTrackingExample : MonoBehaviour
{
public ARTrackedImageManager trackedImageManager;
public GameObject prefab;
void OnEnable()
{
trackedImageManager.trackedImagesChanged += OnTrackedImagesChanged;
}
void OnDisable()
{
trackedImageManager.trackedImagesChanged -= OnTrackedImagesChanged;
}
void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs args)
{
foreach (var image in args.added)
{
// 首次检测到该图像
var placed = Instantiate(prefab, image.transform.position, image.transform.rotation);
placed.transform.SetParent(image.transform);
}
foreach (var image in args.updated)
{
// 图像位置/姿态更新(移动跟踪时)
}
foreach (var image in args.removed)
{
// 图像移出视野
}
}
}
Unity 中图像数据库在 XR → AR Settings → ARCore → Augmented Image Database 中配置,可以直接拖入图片。
性能与精度注意
| 因素 | 影响 |
|---|---|
| 图片质量 | 模糊/压缩过的图片检测率下降 50% 以上 |
| 检测距离 | 太远会看不清特征点,推荐 15cm ~ 2m 范围 |
| 光照条件 | 过于昏暗或强逆光会严重影响检测 |
| 数据库大小 | 数据库越大,每次搜索耗时越长(建议 < 100 张) |
| CPU 开销 | 每帧都做特征点匹配,低端设备可能掉帧 |
建议
- 分批加载:如果有大量目标图像,根据用户当前位置或场景只加载相关的子集
- 尺寸校准:尽量在
addImage()时指定真实物理尺寸,帮助 ARCore 更精确估计距离 - 降级方案:检测失败时给用户提示("请把海报放正、光线充足"),而不是默默无反应
与 Vuforia 的对比
| 对比项 | Augmented Images | Vuforia |
|---|---|---|
| 精度 | 好(Android 新设备上接近 Vuforia) | 非常好(行业标杆) |
| 曲面检测 | 有限 | 强 |
| 3D 物体检测 | 不支持 | 支持 |
| 价格 | 完全免费 | 免费版有功能限制,商业版收费 |
| 开发集成 | 和 ARCore 无缝 | 需要额外 SDK |
| 云端识别 | 不支持 | 支持(Cloud Recognition) |
推荐策略:如果你的识别需求是平面图像触发,Augmented Images 足够用且免费。如果需要高精度 3D 物体识别或云端识别,可以考虑 Vuforia + ARCore 组合。