图片识别要求
- 每个图像数据库可以存储最多 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感兴趣的同学加入.