ARCore图像识别

图片识别要求

  • 每个图像数据库可以存储最多 1000 个参考图像的特征点信息。
  • ARCore 可以在环境中同步跟踪最多 20 个图像,但无法跟踪同一图像的多个实例。
  • 环境中的物理图像必须至少为 15cm x 15cm 且必须平坦(例如,不能起皱或卷绕在瓶子上)
  • 在物理图像被跟踪后,ARCore 会提供对位置、方向和物理大小的估算。 随着 ARCore 收集的数据增多,这些估算会持续优化。
  • ARCore 无法跟踪移动的图像,不过它可以在图像停止移动后继续跟踪。
  • 所有跟踪都在设备上完成,所以无需网络连接。 可以在设备端或通过网络更新参考图像,无需应用更新。

最佳实践

  • 增强图像支持 PNG 和 JPEG 文件格式。 对于 JPEG 文件,为了获得最佳性能,请避免过度压缩。
  • 检测仅基于高对比度的点,所以彩色和黑白图像都会被检测到,无论使用彩色还是黑白参考图像。
  • 图像的分辨率至少应为 300 x 300 像素。
  • 使用高分辨率的图像不会提升性能。
  • 避免使用具有稀疏特征的图像。
  • 避免使用具有重复特征的图像。
  • 肉眼很难分辨高质量的参考图像。 使用 arcoreimg 工具可以获取每个图像的得分(0 - 100)。 我们建议得分至少为 75。下面是两个示例:
得分:100 得分:0
图像包含许多独特的特征点 图像包含高度重复的特征

识别图片动态加载模型

1.选中你要识别的图片,右键-Create > GoogleARCore > AugmentedImageDatabase,命名为”Test Database“;(PS:识别图名称要是唯一的,后期我会通过识别图的名称来动态加载模型)

2.选中刚才创建的”AugmentedImageDatabase“可以查看图像的得分(0 - 100)得分越高,越好识别

3.新建一个空场景,将默认的”Main Camera“删除掉,将GoogleARCore>Prefabs>ARCore Device 预设拖到场景中。

4.打开Assets > GoogleARCore > Examples > AugmentedImage > Configurations,设置AugmentedImageDatabase

5.新建一个”Raw Image“,命名为”FitToScanOverlay“,Texture选择GoogleARCore>Examples>AugmentedImage>Textures> fit_to_scan。隐藏显示

6.新建一个”Resources>TargetObject“文件夹,用来存放我们识别图片后需要加载的模型(模型名称对应识别图片名称)

7.新建两个C#脚本,一个命名为”ImageRecognition“用来管理识别和加载识别模型,另一个命名为”TargetObject“用来管理加载出来的模型对象。代码如下

using GoogleARCore;
using UnityEngine;

/// <summary>管理加载出来的模型对象</summary>
public class TargetObject : MonoBehaviour
{
    private string targetObjectPath = "TargetObject";
    private GameObject model=null;
    public AugmentedImage Image { get; set; }

    public static TargetObject Create()
    {
        TargetObject targetObject = new GameObject().AddComponent<TargetObject>();
        return targetObject;
    }

    private void Update()
    {
        if (Image == null || Image.TrackingState != TrackingState.Tracking)
        {
            if (model != null) model.SetActive(false);
            return;
        }

        if (model != null) model.SetActive(true);
    }

    public void LoadModel(string targetName, Transform parent)
    {
        string modelPath = targetObjectPath + "/" + targetName;
        GameObject prefab = Resources.Load<GameObject>(modelPath);
        if(prefab==null)
        {
            Debug.LogError(GetType() + "/LoadModel()/ Load model error! model is null! modePath:" + modelPath);
            return;
        }

        DeleteModel();//预防重复加载模型

        model = Instantiate(prefab, parent);
        model.name = targetName;
    }

    /// <summary>删除加载出来的模型</summary>
    private void DeleteModel()
    {
        if (model != null) Destroy(model);
    }

    /// <summary>
    /// 释放(将加载出来的模型删除和删除自身)
    /// </summary>
    public void Release()
    {
        DeleteModel();
        Destroy(gameObject);
    }

}

-------------------------------------我是分割线-------------------------------------

using System.Collections.Generic;
using GoogleARCore;
using UnityEngine;

/// <summary>图片识别</summary>
public class ImageRecognition : MonoBehaviour
{
    #region 数据申明

    private GameObject fitToScanOverlay;
    private Dictionary<string, TargetObject> dicTargetObjects = new Dictionary<string, TargetObject>();
    private List<AugmentedImage> m_TempAugmentedImages = new List<AugmentedImage>();

    #endregion

    #region 数据申明

    private void Awake()
    {
        fitToScanOverlay=GameObject.Find("FitToScanOverlay").gameObject;
        Application.targetFrameRate = 60;
    }

    private void Update()
    {
        if (Session.Status != SessionStatus.Tracking)
        {
            Screen.sleepTimeout = SleepTimeout.SystemSetting;
        }
        else
        {
            Screen.sleepTimeout = SleepTimeout.NeverSleep;
        }

        Session.GetTrackables<AugmentedImage>(m_TempAugmentedImages, TrackableQueryFilter.Updated);

        foreach (var image in m_TempAugmentedImages)
        {
            TargetObject target = null;
            dicTargetObjects.TryGetValue(image.Name, out target);
            if (image.TrackingState == TrackingState.Tracking && target == null)
            {
                Anchor anchor = image.CreateAnchor(image.CenterPose);
                TargetObject targetObject= TargetObject.Create();
                targetObject.Image = image;
                targetObject.LoadModel(image.Name, anchor.transform);
                dicTargetObjects.Add(image.Name,targetObject);
            }
            else if (image.TrackingState == TrackingState.Stopped && target != null)
            {
                dicTargetObjects.Remove(image.Name);
                target.Release();  
            }
        }

        foreach (var targetObject in dicTargetObjects.Values)
        {
            if (targetObject.Image.TrackingState == TrackingState.Tracking)
            {
                fitToScanOverlay.SetActive(false);
                return;
            }
        }

        fitToScanOverlay.SetActive(true);
    }

    #endregion

}


官方教程:https://developers.google.cn/ar/develop/unity/augmented-images

Unity QQ交流群:299412191 欢迎对Unity感兴趣的同学加入.

发布了21 篇原创文章 · 获赞 21 · 访问量 2856

猜你喜欢

转载自blog.csdn.net/a451319296/article/details/104111677