- 首先来看看ARCore是否满足你应用的需求:
每个图像数据库可以存储多达1000个参考图像的特征点信息。
ARCore可以在环境中同时跟踪20个图像,但是它不能跟踪同一图像的多个实例。
环境中的物理图像必须至少是15 cm x 15 cm,并且必须是平的(例如,没有褶皱或缠绕在瓶子周围)
一旦被跟踪,ARCore提供对位置、方向和物理大小的估计。随着ARCore收集更多的数据,这些估计不断改进。
ARCore无法追踪移动的图像,但它可以在停止移动后继续跟踪图像。
所有的跟踪都发生在设备上,所以不需要网络连接。参考图像可以在设备上或网络上更新,而不需要更新应用。
(不知道这个是怎么实现的,有没有大神能解惑,因为笔者百度查到的.asset是不能热更新的:https://blog.csdn.net/tutu158/article/details/45099809,这篇博文转了一下才满足他的需求,但是不适用ARCore)
- 选择参考图片的技巧:
增强图像支持PNG和JPEG文件格式。对于JPEG文件,避免对最佳性能进行重压缩。
检测仅基于高对比度的点,因此无论颜色或黑色/白色的参考图像是否被使用,都可以检测到颜色和黑色/白色图像。
图像的分辨率至少应该是300 x 300像素。
使用高分辨率的图像不会提高性能。
避免具有稀疏特征的图像。
避免具有重复功能的图像。
使用arcoreimg工具为每个图像获得0到100的分数。建议75分以上
- 获取最佳追踪的技巧:
物理图像必须占据相机图像的40%。你可以让用户在他们的相机框架中使用FitToScan asset来匹配物理图像。如下图所示:
当一个图像最初被ARCore检测到,并且没有指定预期的物理尺寸时,它的跟踪状态将会暂停。这意味着ARCore已经识别了图像,但是还没有收集到足够的数据来估计它在3D空间中的位置。在图像的跟踪状态跟踪之前,开发人员不应该使用图像的姿态和大小估计。
- 识别图片的步骤:
选中你要识别的图片,右键-Create > GoogleARCore > AugmentedImageDatabase.
打开Assets > GoogleARCore > Examples > AugmentedImage > Configurations,设置AugmentedImageDatabase [图片上传失败...(image-3dadb1-1536550982858)]
查看官方示例脚本(你也可以自己仿写):
第一个参数是:
参考文章:https://segmentfault.com/a/1190000014956669?utm_source=tag-newest
代码解析:
// 检查motion tracking是否在跟踪。
if (Session.Status != SessionStatus.Tracking)
{
return;
}
// 为这个框架获取更新的增强图像
Session.GetTrackables<AugmentedImage>(m_TempAugmentedImages, TrackableQueryFilter.Updated);
// 为更新的增强图像创建可视化工具和锚点,这些图像是跟踪的
foreach (var image in m_TempAugmentedImages)
{
AugmentedImageVisualizer visualizer = null;
m_Visualizers.TryGetValue(image.DatabaseIndex, out visualizer);
if (image.TrackingState == TrackingState.Tracking && visualizer == null)
{
// Create an anchor to ensure that ARCore keeps tracking this augmented image.
Anchor anchor = image.CreateAnchor(image.CenterPose);
visualizer = (AugmentedImageVisualizer)Instantiate(AugmentedImageVisualizerPrefab, anchor.transform);
visualizer.Image = image;
m_Visualizers.Add(image.DatabaseIndex, visualizer);
}
else if (image.TrackingState == TrackingState.Stopped && visualizer != null)
{
m_Visualizers.Remove(image.DatabaseIndex);
GameObject.Destroy(visualizer.gameObject);
}
}
// 如果没有跟踪的图像,就显示出适合扫描的fit-to-scan
foreach (var visualizer in m_Visualizers.Values)
{
if (visualizer.Image.TrackingState == TrackingState.Tracking)
{
FitToScanOverlay.SetActive(false);
return;
}
}
FitToScanOverlay.SetActive(true);
}
}