ARCore之路:AugmentedImage 项目例子分析

项目效果

AugmentedImage

该项目是增强图像的例子,相机捕捉到数据库中的图像之后,将手机中显示的白色方框(下图左侧)对准图像,将会生成一个相框(下图右侧),该相框会根据图像的大小和位置,将图像包围住。
该相框会随着图像的移动而移动,紧紧跟随图像。

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
    {
    
    
        // 识别到 augmented images 后实例化的预制体
        public AugmentedImageVisualizer AugmentedImageVisualizerPrefab;

        // 一个 UI 界面
        public GameObject FitToScanOverlay;
        // augmented images 的编号与它相应相框模型的实例
        private Dictionary<int, AugmentedImageVisualizer> _visualizers
            = new Dictionary<int, AugmentedImageVisualizer>();

        // 存储 augmented images 的集合
        private List<AugmentedImage> _tempAugmentedImages = new List<AugmentedImage>();
        
        public void Awake()
        {
    
    
            Application.targetFrameRate = 60;	// 设为 60 帧
        }

        public void Update()
        {
    
    
            // 按了返回键则退出程序
            if (Input.GetKey(KeyCode.Escape))
                Application.Quit();

            // ARCore 正在进行追踪时,手机永不熄屏,没有在追踪时设置会原本的熄屏时间
            if (Session.Status != SessionStatus.Tracking)
                Screen.sleepTimeout = SleepTimeout.SystemSetting;
            else
                Screen.sleepTimeout = SleepTimeout.NeverSleep;

            // 获得当前帧中的 augmented images
            Session.GetTrackables<AugmentedImage>(
                _tempAugmentedImages, TrackableQueryFilter.Updated);

            foreach (var image in _tempAugmentedImages)
            {
    
    
                // AugmentedImageVisualizer 该脚本是挂载在相框中的
                AugmentedImageVisualizer visualizer = null;
                // 根据 augmented images 的编号 DatabaseIndex 获取对应的相框实例,将相框实例赋值到 visualizer
                _visualizers.TryGetValue(image.DatabaseIndex, out visualizer);
                // 如果当前的 image 是正在追踪的,且它是新识别到的 image,那么给它创建一个相框实例
                if (image.TrackingState == TrackingState.Tracking && visualizer == null)
                {
    
    
                    // 创建一个锚点以确保 ARCore 持续跟踪此增强图像
                    Anchor anchor = image.CreateAnchor(image.CenterPose);
                    // 实例化一个相框出来,并且它的父节点是上一条语句创建的锚点
                    visualizer = (AugmentedImageVisualizer)Instantiate(
                        AugmentedImageVisualizerPrefab, anchor.transform);
                    // 设置相框实例对应的 augmented images
                    visualizer.Image = image;
                    // 将 augmented images 的编号与相框实例绑定,添加到字典
                    _visualizers.Add(image.DatabaseIndex, visualizer);
                }
                else if (image.TrackingState == TrackingState.Stopped && visualizer != null)
                {
    
    
                    // 当前 augmented images 停止追踪了,那么从字典中删除它的 k-v,并 Destroy 该 image 的相框
                    _visualizers.Remove(image.DatabaseIndex);
                    GameObject.Destroy(visualizer.gameObject);
                }
            }

            // 如果当前有正在跟踪 augmented images ,那么就隐藏 UI界面 fit-to-scan overlay
            foreach (var visualizer in _visualizers.Values)
            {
    
    
                if (visualizer.Image.TrackingState == TrackingState.Tracking)
                {
    
    
                    FitToScanOverlay.SetActive(false);
                    return;
                }
            }

            FitToScanOverlay.SetActive(true);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34168988/article/details/124438483