ARCore1.2使用入门(二) ------ ARCore图片识别(unity开发)

  • 首先来看看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分以上

ARCore1.2使用入门(二) ------ ARCore图片识别(unity开发)_第1张图片
image.png
  • 获取最佳追踪的技巧:

物理图像必须占据相机图像的40%。你可以让用户在他们的相机框架中使用FitToScan asset来匹配物理图像。如下图所示:

ARCore1.2使用入门(二) ------ ARCore图片识别(unity开发)_第2张图片
image.png

当一个图像最初被ARCore检测到,并且没有指定预期的物理尺寸时,它的跟踪状态将会暂停。这意味着ARCore已经识别了图像,但是还没有收集到足够的数据来估计它在3D空间中的位置。在图像的跟踪状态跟踪之前,开发人员不应该使用图像的姿态和大小估计。

  • 识别图片的步骤:

选中你要识别的图片,右键-Create > GoogleARCore > AugmentedImageDatabase.

ARCore1.2使用入门(二) ------ ARCore图片识别(unity开发)_第3张图片
image.png

打开Assets > GoogleARCore > Examples > AugmentedImage > Configurations,设置AugmentedImageDatabase [图片上传失败...(image-3dadb1-1536550982858)]

查看官方示例脚本(你也可以自己仿写):

ARCore1.2使用入门(二) ------ ARCore图片识别(unity开发)_第4张图片
image.png

第一个参数是:

ARCore1.2使用入门(二) ------ ARCore图片识别(unity开发)_第5张图片
image.png

参考文章:https://segmentfault.com/a/1190000014956669?utm_source=tag-newest

代码解析:

            // 检查motion tracking是否在跟踪。
            if (Session.Status != SessionStatus.Tracking)
            {
                return;
            }
 
 
            // 为这个框架获取更新的增强图像
            Session.GetTrackables(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);
        }
    }

你可能感兴趣的:(ARCore1.2使用入门(二) ------ ARCore图片识别(unity开发))