项目效果
该项目是增强图像的例子,相机捕捉到数据库中的图像之后,将手机中显示的白色方框(下图左侧)对准图像,将会生成一个相框(下图右侧),该相框会根据图像的大小和位置,将图像包围住。 该相框会随着图像的移动而移动,紧紧跟随图像。
ARCore 最多可以同时跟踪 20 张图像,但 ARCore 不会同时检测或跟踪同一图像的多个实例,即相机捕捉到两张相同的图像,只会跟踪其中的一个。 下图是项目的节点,下面将分析各个节点的作用。
1、ARCore Device
该节点的详情可到此处了解:传送门 它需要ARCore会话配置文件中载入 AugmentedImage 数据库,如下图 那么如何创建 AugmentedImage 数据库呢? 选中需要识别的图像,图像的类型是 Default ,然后右键选择 Create > Google ARCore > AugmentedImageDatabase 创建数据库成功后,点击数据库后如下图,Quality 是图片的质量分数,满分为100,最后使用评分为75以上的图像,该评分是根据图像中的特征点数量来决定了,特征点数量越多,评分越高。可以通过 Session.GetTrackables<AugmentedImage>(_tempAugmentedImages, TrackableQueryFilter.Updated); 来获得当前相机捕捉到的图像,该语句会将捕获到的图像存储到 _tempAugmentedImages 集合中。
2、ExampleController
当相机捕捉到数据库中的图像后,会根据图像的大小和位置生成相框,具体的代码实现请看下面的注释。
namespace GoogleARCore.Examples.AugmentedImage
{
using System.Collections.Generic;
using System.Runtime.InteropServices;
using GoogleARCore;
using UnityEngine;
using UnityEngine.UI;
public class AugmentedImageExampleController : MonoBehaviour
{
public AugmentedImageVisualizer AugmentedImageVisualizerPrefab;
public GameObject FitToScanOverlay;
private Dictionary<int, AugmentedImageVisualizer> _visualizers
= new Dictionary<int, AugmentedImageVisualizer>();
private List<AugmentedImage> _tempAugmentedImages = new List<AugmentedImage>();
public void Awake()
{
Application.targetFrameRate = 60;
}
public void Update()
{
if (Input.GetKey(KeyCode.Escape))
Application.Quit();
if (Session.Status != SessionStatus.Tracking)
Screen.sleepTimeout = SleepTimeout.SystemSetting;
else
Screen.sleepTimeout = SleepTimeout.NeverSleep;
Session.GetTrackables<AugmentedImage>(
_tempAugmentedImages, TrackableQueryFilter.Updated);
foreach (var image in _tempAugmentedImages)
{
AugmentedImageVisualizer visualizer = null;
_visualizers.TryGetValue(image.DatabaseIndex, out visualizer);
if (image.TrackingState == TrackingState.Tracking && visualizer == null)
{
Anchor anchor = image.CreateAnchor(image.CenterPose);
visualizer = (AugmentedImageVisualizer)Instantiate(
AugmentedImageVisualizerPrefab, anchor.transform);
visualizer.Image = image;
_visualizers.Add(image.DatabaseIndex, visualizer);
}
else if (image.TrackingState == TrackingState.Stopped && visualizer != null)
{
_visualizers.Remove(image.DatabaseIndex);
GameObject.Destroy(visualizer.gameObject);
}
}
foreach (var visualizer in _visualizers.Values)
{
if (visualizer.Image.TrackingState == TrackingState.Tracking)
{
FitToScanOverlay.SetActive(false);
return;
}
}
FitToScanOverlay.SetActive(true);
}
}
}
|