unity2019+EasyAR开发多图像识别、跟踪

前言

这是我们大学开设的增强现实课程作业,老师要求我们照着视频开发一个类似的程序,用其余的marker控制一个marker的平移、旋转等操作
在这里插入图片描述

1、一开始我用的ARcore开发,然后脑子抽了把unity更新到最新的2019就打不开了,(推荐《ARcore之路》这本书,然鹅截止到现在只有电子版,纸质版还没出,出了必买)
2、后来转到了ARfoundation,但不能平移旋转,五一假期找了两天的原因,快疯了,网上关于这个ARfoundation的介绍很少,deadline快到了,就放弃了。
3、最后用的EasyAR,这个还是国产的用的感觉不错。

特别鸣谢

特别感谢:卢姥爷,我照着官网给的demo一点点摸索的时候出了很多的错误,是卢姥爷不厌其烦的给我讲,最后终于搞定了!

从零开始

废话不多说,开始:
1、建立一个工程,导入一个easyAR的sdk,将在官网上获得的key填进去。
在这里插入图片描述
因为我做的多图识别跟踪(3个),所以将easyAR里面的EasyAR_ImageTracker-1拉到上面的Hierarchy中,然后每个图片对应一个ImageTarget,用几张图片拖几个上来。(注,网上的教程都是2017年到2019年初的,那时候EasyAR还没有到4.0版本,所以会有MultiImageTracker啥玩意的,这是个坑,我当时在我的4.0版本中咋找都找不到,后来发现合并了)
将camera的background设置为纯黑色,demo里是这样的。
MySample是一个空对象,一会要绑定脚本,后面再提。
2、将里面的Simultaneous Target设置为你要跟踪的图片数,也可以大于,比如我要识别3个,那我里面的数可以大于等于3
在这里插入图片描述
3、将你识别图片后要产生的预制件放到ImageTarget下,记得调整scale,让你的图片能显示在屏幕中。
在这里插入图片描述
一定要在你的工程里面建立一个交StreamingAssets的文件夹,用来放置你要识别的图片,ImageTarget中可以填绝对路径也可以填相对路径,就是相对于StreamingAssets的路径,里面的Tracker设置为EasyAR_ImageTracker-1。
4、写脚本
在Assets文件夹下新建一个Scripts文件夹,把你今后所有的脚本都放进去。
新建MyImageTrackingSample.cs的脚本
using easyar;
using System;
using System.Collections.Generic;
using UnityEngine;

namespace ImageTracking_ImageTarget
{
public class MyImageTrackingSample : MonoBehaviour
{
public ARSession Session;
private Dictionary<ImageTargetController, bool> imageTargetControllers = new Dictionary<ImageTargetController, bool>();
private ImageTargetController controllerTicket;
private ImageTargetController controllerIdback;
private ImageTargetController controllerKing;

    private ImageTrackerFrameFilter imageTracker;
    private VideoCameraDevice cameraDevice;

    public GameObject idback;
    public GameObject ticket;
    public GameObject king;
    float angle_o = 0.0f;//操作前旋转标志物的旋转角度
    Vector3 position_o = new Vector3(0, 0, 0);
    Vector3 player = new Vector3(0, 0, 0);
    private void Start()
    {
        
    }
    private void Awake()
    {
        imageTracker = Session.GetComponentInChildren<ImageTrackerFrameFilter>();
        cameraDevice = Session.GetComponentInChildren<VideoCameraDevice>();
        // targets from scene
        idback = GameObject.Find("ironman");//获得预制件
        ticket = GameObject.Find("ImageTarget_ticket");//不知道为什么这里是ImageTarget的名字
        king = GameObject.Find("ImageTarget_king");
        controllerTicket = GameObject.Find("ImageTarget_ticket").GetComponent<ImageTargetController>();
        controllerIdback = GameObject.Find("ImageTarget_idback").GetComponent<ImageTargetController>();
        controllerKing = GameObject.Find("ImageTarget_king").GetComponent<ImageTargetController>();
        imageTargetControllers[controllerTicket] = false;
        imageTargetControllers[controllerIdback] = false;
        imageTargetControllers[controllerKing] = false;
        AddTargetControllerEvents(controllerTicket);
        AddTargetControllerEvents(controllerIdback);
        AddTargetControllerEvents(controllerKing);
        position_o = king.transform.position;//position_o是控制移动的标志块的坐标向量的初始值
        player = idback.transform.position;//钢铁侠初始位置
        angle_o = ticket.transform.localEulerAngles.x;//控制旋转的标志块初始的欧拉角,不知道为什么x、y、z有同样的效果
    }
    private void Update()
    {     
        if (imageTargetControllers[controllerTicket] && imageTargetControllers[controllerIdback])//身份证和车票被选中,控制旋转
        {
            float angle = ticket.transform.localEulerAngles.z;//操作后z轴旋转角,每帧都要获取该角度
            idback.transform.Rotate(0, angle_o - angle, 0);//rotate是在真实世界里旋转的所以为y轴,angle - angle_o会使基点即钢铁侠旋转方向与标志块相反;猜想:比如原来angle_o为30度,后来angle变为50度,表明逆时针旋转20度,所以将钢铁侠的朝向减20度(-20)就是新的方向,
            angle_o = angle;//将朝向更新
        }
        if (imageTargetControllers[controllerKing] && imageTargetControllers[controllerIdback])//k和车票被选中,控制旋转
        {
            Vector3 position_n = king.transform.position;//获得控制运动的扑克牌新的位置
            player = player + (position_n - position_o) * 0.2f;//新的位置减去原来的位置得到的向量在加上钢铁侠起始位置就是现在的位置
            idback.transform.position = player;//更新钢铁侠的位置
            position_o = position_n;//更新每帧中的位置的标记块的坐标,这样插值就是每帧移动的距离
        }
    }
    private void AddTargetControllerEvents(ImageTargetController controller)
    {
        if (!controller)
        {
            return;
        }
        controller.TargetFound += () =>
        {
            Debug.LogFormat("Found target {{id = {0}, name = {1}}}", controller.Target.runtimeID(), controller.Target.name());

        };
        controller.TargetLost += () =>
        {
            Debug.LogFormat("Lost target {{id = {0}, name = {1}}}", controller.Target.runtimeID(), controller.Target.name());
        };
        controller.TargetLoad += (Target target, bool status) =>
        {
            imageTargetControllers[controller] = status ? true : imageTargetControllers[controller];
            Debug.LogFormat("Load target {{id = {0}, name = {1}, size = {2}}} into {3} => {4}", target.runtimeID(), target.name(), controller.Size, controller.Tracker.name, status);
        };
        controller.TargetUnload += (Target target, bool status) =>
        {
            imageTargetControllers[controller] = status ? false : imageTargetControllers[controller];
            Debug.LogFormat("Unload target {{id = {0}, name = {1}}} => {2}", target.runtimeID(), target.name(), status);
        };
    }
}

}
这里也有个坑,就是之前的版本声明的时候是using EasyAR;
4.0版本改为了using easyar。
写完之后把这个脚本挂载到MySample空对象上去
在这里插入图片描述
别忘了将里面的对象附上你的预制件!

万事具备

做到这里你的工作基本就完成了
将工作平台转换成安卓,点击player setting,做如下修改:
在这里插入图片描述
将里面的Vulkan去掉,然后取消勾选多线程渲染,Multithreaded Rendering
在这里插入图片描述
最上面的那个改为你在官网填的那个,不然会黑屏。然后修改下面的APIlevel。

至此,你已经完成了全部的工作(如果我没忘记某些步骤的化)!可以发布到手机上看看吧!

菜比的后记:现在记录一下,当以后有时间了可以继续研究AR。第一次写CSDN,还不会用,还是希望自己的打代码的技术能有所提高吧,任何时候都不能放弃希望,不是吗?

### 回答1: b'easyar4.0与Unity图像识别的区别是什么?' easyar4.0是一款专门用于图像识别的软件开发工具,而Unity则是一款游戏引擎。虽然Unity也支持图像识别功能,但是easyar4.0在这方面更加专业和方便,可以更快速地开发出高质量的图像识别应用程序。另外,easyar4.0还支持多平台开发,包括iOS、Android和Windows等操作系统,在跨平台图像识别方面有着更强的优势。 ### 回答2: 易盾AR4.0是一款先进的增强现实技术软件,主要用于实现AR教育、AR游戏、AR导航、AR营销、AR打印、AR展示等多种应用场景,可以快速、精准地识别并追踪现实世界中的图像、物体、地标等,实现现实世界与虚拟世界的无缝衔接。在实现AR技术的应用过程中,Unity是目前最为流行的游戏引擎之一,支持3D及2D开发,易盾AR4.0也可轻松与Unity进行深度集成,实现优质的AR应用体验。 EasyAR4.0和Unity图片识别的结合使用可以实现具有高度智能化的增强现实效果,满足多种应用的需求。EasyAR4.0提供的图像识别技术可以对于预设好的图像进行快速、准确的识别,同时还可以追踪出图像的位置、大小、方向等元素的相关信息,为效果展示提供了基础的数据支持。而Unity则提供了丰富的图形渲染和动画特效制作功能,能够更好地呈现AR效果。 通过EasyAR4.0和Unity应用配合开发,可以在AR教育中实现具有互动性的科普展示;在AR游戏中增强游戏场景的真实感;在AR导航中将现实世界与虚拟地图相结合,方便用户更好地进行导航;在AR营销中增强产品的展示效果等。 总之,EasyAR4.0与Unity的结合对于实现AR应用具有重要的意义,可以为AR应用领域的发展带来重大的推动作用。 ### 回答3: EasyAR是一款跨平台的增强现实SDK,而Unity是一款游戏引擎。EasyAR的4.0版本是其最新的版本,提供了更加稳定、高效的识别和跟踪功能。EasyAR4.0能够通过自己的AR引擎,对现实世界进行实时检测,能够实现二维码、图像、目标、物体的跟踪与识别。 在Unity中使用EasyAR4.0能够实现非常流畅和高效的增强现实效果。首先,开发者需要先将EasyAR插件设置好,然后将识别的图像或物体导入Unity中进行编辑。这包括添加AR相机、设置AR目标、添加跟踪事件等等。然后开发者可以使用Unity所提供的各种功能,例如粒子效果和声音效果,用来强化增强现实效果。 相对于其他增强现实SDK,EasyAR4.0的优势在于它提供了丰富的资料支持和社区支持。EasyAR官网提供了许多视频教程、开发文档和示例代码,能够让开发者更快速地上手。此外,EasyAR还提供了一个活跃的社区,开发者能够在上面分享自己的经验和获取他人的帮助。 总之,EasyAR4.0作为一个成熟的增强现实引擎,与Unity的结合使用能够实现出色的AR应用。希望今后EasyAR能够不断更新和完善,为AR开发者提供更好的开发工具和平台。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值