如前所述,ARCore图像识别还有较多的限制,随着技术的发展,相信会发展得越来越好。从计算机视觉技术来说,图像识别是一项非常复杂的技术,但ARCore将技术细节封装得非常好,使用起来非常方便。
一、创建图像库
我们可以直接从图像文件创建图像库,也可以使用菜单创建图像库,图像库就是放置用来做对比的图像,按Google的说法,ARCore最大支持1000张图像。经过我们的测试,建议分辨率大于300 * 300,最好到1024 * 512左右,但分辨率高的图像会使识别速度变慢,重复元素很多的图像(例:高层大楼)和特征很少的图像(例:公园的广场等)ARCore的识别率还是比较低的,在使用前最好用我们之前提到的ARCoreimg查看一下分数,建议在50以上。创建与配置图像库(创建的图像数据库名为:FoxDataBase)操作如下:
二、设置配置文件
创建了图像数据库,我们还得在配置文件里设置一下,首先我们需要创建一个配置文件(创建的配置文件名为:ARCoreSessionConfig),然后对配置文件进行设置,然后替换Scene 中的 ARCore Device中的配置文件,操作步骤如下:
三、制作取景框
前文提到过,为了有效的识别图像,物理图像必须占据摄像头图像的 40%以上,为了更方便用户取图,我们制作一个取景框,确保图像能有效被ARCore采集,也就是所谓有Fit to Scan功能。首先,我们在Hirerachy中新建一个RawImage UI,然后将事先制作好的取景框图片(务必为png格式并设置好了透明度)设置为Raw Image 的 Texture,如下图所示:
四、编写代码
准备工作已基本做好,下面我们编写AppController代码如下:
public Camera FirstPersonCamera;
public GameObject mprefab;
private bool mIsQuitting = false;
private const float mModelRotation = 180.0f;
public GameObject mFitToScanOverlay;
private Dictionary<int, GameObject> mVisualizers = new Dictionary<int, GameObject>();
private List<AugmentedImage> mTempAugmentedImages = new List<AugmentedImage>();
private bool mTracking = false;
void Start () {
OnCheckDevice();
}
// Update is called once per frame
void Update () {
UpdateApplicationLifecycle();
Session.GetTrackables<AugmentedImage>(mTempAugmentedImages, TrackableQueryFilter.Updated);
foreach (var image in mTempAugmentedImages)
{
GameObject prefab = null;
mVisualizers.TryGetValue(image.DatabaseIndex, out prefab);
if (image.TrackingState == TrackingState.Tracking && prefab == null)
{
Anchor anchor = image.CreateAnchor(image.CenterPose);
var FoxObject = Instantiate(mprefab, anchor.transform.position, anchor.transform.rotation);
FoxObject.transform.Rotate(-90.0f, mModelRotation, 0, Space.Self);
mVisualizers.Add(image.DatabaseIndex, FoxObject);
mTracking = true;
}
else if (image.TrackingState == TrackingState.Stopped && prefab != null)
{
mVisualizers.Remove(image.DatabaseIndex);
GameObject.Destroy(prefab);
mTracking = false;
}
}
// Show the fit-to-scan overlay if there are no images that are Tracking.
foreach (var visualizer in mVisualizers.Values)
{
if (mTracking)
{
mFitToScanOverlay.SetActive(false);
return;
}
}
mFitToScanOverlay.SetActive(true);
}
上面代码我们还需要引用 GoogleARCore.Examples.AugmentedImage 命名空间,代码逻辑很简单,如果识别图像成功,我们则实例化Fox对象,并且我们还处理了取景框,确保取景框只在没有跟踪到对象时才显示。
编译、运行效果如下: