《AR与VR开发实战》——2.12 自定义目标识别

简介:

本节书摘来自华章出版社《AR与VR开发实战》一书中的第2章,第2.12节,作者 张克发 赵兴 谢有龙,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.12 自定义目标识别

在AR开发过程中,很多人会觉得将识别图上传到官网数据库然后再从数据库下载这个过程难免有些繁琐,尽管有FrameMaker和云识别这些强大的功能,但还是会有人觉得麻烦。那么,如何在使用时实时创建识别图,就是本节我们要给大家介绍的新功能,自定义目标
识别。
有必要提前介绍一下自定义目标识别的工作原理,打开摄像头开始扫描后,以扫描到的某一固定场景作为识别图,实现这一步骤的方法就是使用摄像头进行拍照,这时就需要一个触发拍照的指令,我们用一个Button来实现。所以最终的效果就是画面中会一直有一个Button,当我们扫描到我们要自定义的识别图时,按下Button,然后识别图创建完成,扫描该识别图,模型出现。
1.插件下载
访问https://developer.vuforia.com/downloads/sdk,进入如下界面,并下载Vuforia SDK的
Unity版本。


a1b3fc711b14b00cdb4ef403ea8217e785d04e8e

2.创建Unity工程
新建一个Unity工程并将下载好的插件导入Unity。
3.场景搭建
删除场景中原有的Main Camera,接着从Vuforia→Prefabs路径下将ARCamera、ImageTarget
以及UserDefinedTargetBuilder拖入场景。
接着在ARCamera的Inspector面板下添加App License Key。随后在ImageTarge的Inspector面板下将ImageTarget类型设置为UserDefined。


22430cae7d7fe1e31a627a32d745cae487361282

接下来需要添加模型,这里用Cube来代替,我们在ImageTarget下添加一个Cube。最后创建Button按钮,这也是我们创建自定义识别图时最重要的一步。
4.编写脚本
在Project下新建一个C#脚本,脚本主框架如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Vuforia;

public class UDTTest: MonoBehaviour,IUserDefinedTargetEventHandler
{

void Start ()
{

}
public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality) { }
public void OnInitialized() { }
public void OnNewTrackableSource(TrackableSource trackableSource) { }
public void BuildNewTarget()
{
}

}
这个类中比较关键的是IUserDefinedTargetEventHandler这个接口,其中定义了OnFrame QualityChanged、OnInitialized和OnNewTrackableSource三个方法。我们实现这个接口中的三个方法,并将脚本附加到UserDefinedTargetBuilder上。
首先需要声明一个UserDefinedTargetBuildingBehaviour类型的变量,接着在Start函数里将当前类注册为该类型事件。
UserDefinedTargetBuildingBehaviour mTargetBuildingBehaviour;

void Start ()
{
    mTargetBuildingBehaviour = GetComponent<UserDefinedTargetBuildingBehaviour>();
    if (mTargetBuildingBehaviour)
    {
        mTargetBuildingBehaviour.RegisterEventHandler(this);
        Debug.Log("Registering User Defined Target event handler.");
    }
}

接下来要实现接口中的三个函数,首先是OnInitialized,用来初始化一些数据,我们在这个函数里写入下面的代码:
public void OnInitialized()

{
    mObjectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
    if (mObjectTracker != null)
    {
        mBuiltDataSet = mObjectTracker.CreateDataSet();
        mObjectTracker.ActivateDataSet(mBuiltDataSet);
    }
}

这里用到两个新的变量,需要提前声明,如下:
ObjectTracker mObjectTracker;
// 新定义的数据集添加到DataSet里
DataSet mBuiltDataSet;
接着是OnFrameQualityChanged这个函数,用来更新当前帧质量。我们在函数里写入下面的代码:
public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality)
{

mFrameQuality = frameQuality;
if (mFrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_LOW)
{
    Debug.Log("Low camera image quality");
}

}
这里的mFrameQuality 是一个用来记录当前帧图像质量的枚举类型,声明如下:
ImageTargetBuilder.FrameQuality mFrameQuality = ImageTargetBuilder.FrameQuality.FRAME_QUALITY_NONE;
最后也是最重要的一个方法OnNewTrackableSource的代码如下:
public void OnNewTrackableSource(TrackableSource trackableSource)
{

mTargetCounter++;
// Deactivates the dataset first
mObjectTracker.DeactivateDataSet(mBuiltDataSet);

// Destroy the oldest target if the dataset is full or the dataset 
// already contains five user-defined targets.
if (mBuiltDataSet.HasReachedTrackableLimit() || mBuiltDataSet.GetTrackables().Count() >= 5)
{
    IEnumerable<Trackable> trackables = mBuiltDataSet.GetTrackables();
    Trackable oldest = null;
    foreach (Trackable trackable in trackables)
    {
        if (oldest == null || trackable.ID < oldest.ID)
            oldest = trackable;
        }

    if (oldest != null)
    {
        Debug.Log("Destroying oldest trackable in UDT dataset: " + oldest.Name);
        mBuiltDataSet.Destroy(oldest, true);
    }
}

// Get predefined trackable and instantiate it
ImageTargetBehaviour imageTargetCopy = (ImageTargetBehaviour)Instantiate(ImageTargetTemplate);
imageTargetCopy.gameObject.name = "UserDefinedTarget-" + mTargetCounter;

// Add the duplicated trackable to the data set and activate it
mBuiltDataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject);

// Activate the dataset again
mObjectTracker.ActivateDataSet(mBuiltDataSet);

}
这个函数里需要提前声明的变量有两个,如下:
int mTargetCounter;
//声明一个公开的ImageTargetBehaviour,然后在Unity中赋值
public ImageTargetBehaviour ImageTargetTemplate;
最后一个就是我们自定义的函数BuildNewTarget,代码如下:
public void BuildNewTarget()
{

mTargetBuildingBehaviour.BuildNewTarget("test", 50);

}
然后还需要返回Unity中进行一些细微的设置调整,将我们的脚本拖到UserDefined TargetBuilder下,并为ImageTargetTemplate进行赋值。


d7429e35ccc586bef581496ea1281c771177ffdc

然后在Button上添加点击事件,步骤如下。


2d1f9ed5e60d1c4f9bf8661468efb414c23ea722


e74ed266daa54e486bcd5d61d33895452833e504

然后在UserDefinedTargetBuilder上勾选Start scanning automatically,表示开启自动扫描。
5.运行工程
首先拍摄一张图片,界面如下。


fc0b9a7597f521a4ad7adea3c2437efec247a485

将我们需要自定义的识别图置于取景框内,点击Button便可识别出Cube,将识别图移出摄像头取景范围,模型消失,再次扫描刚才的识别图,依然出现模型。


61ff691d79721dfd5ca56fc7dd36f105db1cb7ca

至此,Vuforia的自定义目标识别介绍完毕,大家可以根据自己的需求发挥想象力,制作出属于自己的炫酷AR产品。
相关文章
|
3月前
|
人工智能 编解码 5G
虚拟现实(VR)与增强现实(AR)的融合:开启全新交互时代
【6月更文挑战第17天】虚拟现实(VR)与增强现实(AR)融合成混合现实(MR),打造全新交互体验。MR结合VR的沉浸感和AR的现实增强,应用于教育、游戏、设计和营销,带来创新教学方式、沉浸式游戏体验和高效设计工具。尽管面临技术挑战,随着5G和AI的发展,MR有望引领未来交互的革命。
|
3月前
|
传感器 数据可视化 安全
【虚拟现实】二、主要的AR/VR硬件设备
【虚拟现实】二、主要的AR/VR硬件设备
62 3
|
3天前
|
5G 测试技术 语音技术
5G赋能沉浸式体验:VR/AR时代的网络基石
5G赋能沉浸式体验:VR/AR时代的网络基石
14 1
|
1月前
|
编解码 vr&ar 芯片
VR与AR:未来的科技趋势
【8月更文挑战第26天】VR与AR技术正以前所未有的速度发展,并在市场规模、技术创新、应用场景以及竞争格局等方面展现出强劲的增长潜力。随着技术的不断进步和应用场景的不断拓展,VR/AR/MR技术将为人们带来更加丰富的虚拟体验和更加便捷的生活方式。未来,我们有理由相信,VR与AR技术将在多个领域实现更广泛的应用和更深入的融合,成为推动社会进步的重要力量。
|
28天前
|
vr&ar 图形学 开发者
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
64 0
|
28天前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
33 0
|
2月前
|
传感器 人工智能 数据可视化
虚拟现实(VR)与增强现实(AR)的技术革新:塑造未来的沉浸式体验
【7月更文挑战第24天】VR和AR作为两种前沿的沉浸式技术,正以前所未有的速度改变着我们的世界。随着技术的不断革新和应用的不断拓展,我们有理由相信,未来的VR和AR将为我们带来更多令人惊叹的体验和技术革新。
|
3月前
|
vr&ar
AR和VR的光学结构分别是什么?
【6月更文挑战第25天】AR和VR的光学结构分别是什么?
93 5
|
3月前
|
传感器 物联网 5G
AR和VR
【6月更文挑战第25天】AR和VR
95 4
|
3月前
|
传感器 数据可视化 人机交互
虚拟现实(VR)与增强现实(AR)技术解析
【6月更文挑战第27天】 VR创造沉浸式虚拟环境,模拟真实感受,应用于旅游、医疗、教育和游戏。AR将虚拟信息叠加到现实,强调虚实结合与实时交互,常见于游戏、教育、购物和医疗。两者提供超越现实的体验,随着技术进步,将在更多领域发挥作用,开启新可能。

热门文章

最新文章