ARFoundation从零开始5-AR图像跟踪

以现实世界中的某物体、某介质为参照物,将AR内容固定到该参照物的相对位置,伴随参照物的移动而发生相对位置的改变,即所谓的AR跟踪。

2D图像追踪(ARKit和ARCore),通过检测环境中的特定2D图像,Tracked Image Manager可以自动创建表示所有已识别图像的GameObject,让你可以根据特定图像改动AR体验。

本项目示例源代码:

https://github.com/sueleeyu/ar-augment

一、创建项目工程

1.新建项目

2.重命名为ImagesScene,选择Window-Package Manager- Unity Register,依次下载:

XR Plugin Management 4.0.7

AR Foundation 4.1.10

ARCore XR Plugin 4.1.10

ARKit XR Plugin 4.1.10

3.如下:

二、添加AR组件

1.删除原有摄像机, 点击“+”,添加Session Origin,AR Session:

2.选择 AR Session Origin,Inspector中点击添加组件,搜索框输入art,选择AR Tracked Image Manager添加。

三、添加界面UI和模型

1.log Text,用来显示日志信息:Hierarchy-‘+’- UI –Text,新建Text组件,命名Log,设置:

2.添加Button,Hierarchy-Canvas右键,UI-Button,设置:

Button-Text设置:

四、创建参考图库

1.Project –Assets 右键,Create-Folder,新建文件夹,命名Images:

2.创建参考图库,Project –Assets –Images 右键,Create-XR-Reference Image Library:

3.复制多张图片到Images目录下:

4.添加参考图,选择ReferenceImageLibrary,点击右侧Inspector的Add Image

5.拖动图片到右侧贴图,依次完成参考图的添加:

添加如下:

 

参考图中属性的含义:

Name:每一个参考图有一个唯一的guid和一个name,Name可以用来实时匹配检测到的图片和参考图

Specify Size:指定图片的大小,一些平台下需要指定才能识别,所有最好选中。

Keep Texture at Runtime:是否使用纹理,如果要修改Prefab外观可以选中。

6. AR Tracked Image Manager添加Reference Library属性:选择Hierarchy-AR Session Origin,选择右侧Inspector的AR Tracked Image Manager项的Serialized Library右侧圆点,点击列表对应项添加:

五、需要的图片和预制件

1.Hierarchy下新建Cube,命名One(对应参考库中图片Name),拖动Images下One.png到场景中的Cube:

 

2.Assets下新建Resources/Prefabs文件夹,把立方体One拖动到Prefabs下,删除场景中的One,其他依次制作。

六、编写脚本

1. Project-Assets右键,新建Scripts文件夹,新建Logger.cs,用于查看log日志

 

2.Logger挂载

代码:

using System.Collections.Generic;
using System.Text;
using UnityEngine.UI;

namespace UnityEngine.XR.ARFoundation.Samples
{
    public class Logger : MonoBehaviour
    {
        [SerializeField]
        Text m_LogText;//挂载到Log Text组件
        public Text logText
        {
            get => m_LogText;
            set => m_LogText = value;
        }

        [SerializeField]
        int m_VisibleMessageCount = 40;
        public int visibleMessageCount
        {
            get => m_VisibleMessageCount;
            set => m_VisibleMessageCount = value;
        }

        int m_LastMessageCount;

        static List<string> s_Log = new List<string>();

        static StringBuilder m_StringBuilder = new StringBuilder();

        void Awake()
        {
            if (m_LogText == null)
            {
                m_LogText = GetComponent<Text>();
            }

            lock (s_Log)
            {
                s_Log?.Clear();
            }

            Log("Log console initialized.");
        }

        void Update()
        {
            lock (s_Log)
            {
                if (m_LastMessageCount != s_Log.Count)
                {
                    m_StringBuilder.Clear();
                    var startIndex = Mathf.Max(s_Log.Count - m_VisibleMessageCount, 0);
                    for (int i = startIndex; i < s_Log.Count; ++i)
                    {
                        m_StringBuilder.Append($"{i:000}> {s_Log[i]}\n");
                    }

                    var text = m_StringBuilder.ToString();

                    if (m_LogText)
                    {
                        m_LogText.text = text;
                    }
                    else
                    {
                        Debug.Log(text);
                    }
                }

                m_LastMessageCount = s_Log.Count;
            }
        }

        public static void Log(string message)
        {
            lock (s_Log)
            {
                if (s_Log == null)
                    s_Log = new List<string>();

                s_Log.Add(message);
            }
        }
    }
}

 

做关联:

 

3.新建MultiImageTracking.cs,编写代码。

加载预制件,在Strat中:

void Start()

        {

            //加载预制件

            GameObject one = Resources.Load<GameObject>("Prefabs/One");

            prefabs.Add("One", one);

            GameObject two= Resources.Load<GameObject>("Prefabs/Two");

            prefabs.Add("Two", two);

            GameObject qrcode = Resources.Load<GameObject>("Prefabs/QRCode");

            prefabs.Add("QRCode", qrcode);

            Logger.Log("MultiImageTracking-Start");

        }

4.注册ARTrackedImagesChangedEventArgs事件:

private void OnEnable()

        {

            ImgTrackedManager.trackedImagesChanged += OnTrackedImagesChanged;

        }

OnTrackedImagesChanged中实现加载:

void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)

        {

            foreach (var trackedImage in eventArgs.added)

            {

                // Give the initial image a reasonable default scale

                var minLocalScalar = Mathf.Min(trackedImage.size.x, trackedImage.size.y) / 2;

                trackedImage.transform.localScale = new Vector3(minLocalScalar, minLocalScalar, minLocalScalar);//对模型缩放

                Instantiate(prefabs[trackedImage.referenceImage.name], trackedImage.transform);//实例化预制件

                //OnImagesChanged(trackedImage);

            }           

        }

5.挂载MultiImageTracking.cs到AR Session Origin,选择AR Session Origin,Inspector中点击Add Component,输入并选择MultiImageTracking.cs,将Button-Text组件拖到MultiImageTracking的Toggle Text属性栏:

 

七、android打包

1.运行:

   

八、常见问题

1.ARFoundration打包会报错:“Failded to generated ARCore reference image library”

报错原因应该是图像质量不符合要求。

九、参考文献

1. Unity api:

Unity - Manual: Unity User Manual 2021.3 (LTS)

2.ARFoundation示例:

GitHub - Unity-Technologies/arfoundation-samples: Example content for Unity projects based on AR Foundation

3.ARCore 文档

为图像添加维度  |  ARCore  |  Google Developers

4.本项目示例源代码:

sueleeyu/ar-augment · GitHub

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ARFoundation是一个用于在移动设备上创建现实增强应用程序的开发框架。人脸跟踪编程是ARFoundation系列教程中的一部分。 人脸跟踪是通过相机捕捉实时视频流并使用AR技术来检测和跟踪人脸的过程。这个过程涉及到计算机视觉和人工智能的技术,可以在移动设备上实时地识别人脸,进而应用各种效果和交互。 在ARFoundation系列教程中学习人脸跟踪编程,你将学习如何使用ARFoundationUnity引擎来构建具有人脸追踪功能的应用程序。教程会向你介绍如何在Unity中创建一个AR项目,并使用ARFoundation的API来实现人脸追踪功能。 首先,你需要在Unity中导入ARFoundation库并设置相机权限。然后,你可以创建一个3D模型来代表人脸,并将其与人脸跟踪的数据进行关联。在跟踪开始后,你可以通过获取人脸的特征点信息和姿势来实时地更新模型的位置和角度。 此外,你还可以根据人脸的表情特征,例如眨眼、微笑等,来触发应用程序中的效果或交互。例如,你可以通过检测到用户眨眼的动作来实现快门的触发,拍摄照片或录制视频。 通过学习ARFoundation系列教程中的人脸跟踪编程,你将能够掌握如何使用AR技术在移动设备上实现实时人脸跟踪功能。这将为你开发创新的增强现实应用程序提供基础,并且能够为用户提供更加沉浸式和交互性的体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值