博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《AR与VR开发实战》——2.12 自定义目标识别
阅读量:6880 次
发布时间:2019-06-27

本文共 4409 字,大约阅读时间需要 14 分钟。

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

2.12 自定义目标识别

在AR开发过程中,很多人会觉得将识别图上传到官网数据库然后再从数据库下载这个过程难免有些繁琐,尽管有FrameMaker和云识别这些强大的功能,但还是会有人觉得麻烦。那么,如何在使用时实时创建识别图,就是本节我们要给大家介绍的新功能,自定义目标

识别。
有必要提前介绍一下自定义目标识别的工作原理,打开摄像头开始扫描后,以扫描到的某一固定场景作为识别图,实现这一步骤的方法就是使用摄像头进行拍照,这时就需要一个触发拍照的指令,我们用一个Button来实现。所以最终的效果就是画面中会一直有一个Button,当我们扫描到我们要自定义的识别图时,按下Button,然后识别图创建完成,扫描该识别图,模型出现。
1.插件下载
访问,进入如下界面,并下载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
(); if (mTargetBuildingBehaviour) { mTargetBuildingBehaviour.RegisterEventHandler(this); Debug.Log("Registering User Defined Target event handler."); }}

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

public void OnInitialized()

{    mObjectTracker = TrackerManager.Instance.GetTracker
(); 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 firstmObjectTracker.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
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 itImageTargetBehaviour imageTargetCopy = (ImageTargetBehaviour)Instantiate(ImageTargetTemplate);imageTargetCopy.gameObject.name = "UserDefinedTarget-" + mTargetCounter;// Add the duplicated trackable to the data set and activate itmBuiltDataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject);// Activate the dataset againmObjectTracker.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产品。

转载地址:http://wkbbl.baihongyu.com/

你可能感兴趣的文章
JSON+JSONP(加量不加价)
查看>>
windows下安装ubuntu,并用win引导ubuntu启动
查看>>
java开发常用工具
查看>>
在VMware Vcenter添加一块网卡后,启动虚机找不到网卡,发现有一个ens38(redhat7.5)...
查看>>
static 关键字和类的加载顺序
查看>>
安卓ListView基础应用
查看>>
【原创】PostgreSQL 快速创建空表TIPS
查看>>
利用PowerBI结合SCOM展示数据报表
查看>>
中学时代的记忆---老师的黑板
查看>>
Horizon View 6-View Connection Server部署⑴
查看>>
iptables 实战演练
查看>>
Python 学习笔记 - 线程(线程锁,信标,事件和条件)
查看>>
RHEL6基础四十一之selinux和iptables基础
查看>>
数据结构之单链表在第i个元素之前插入元素的算法
查看>>
Exchange Server 运维管理02:邮箱数据库存储原理
查看>>
Exchange Server2013 系列十:证书的配置
查看>>
Cygwin新手必读
查看>>
52.本地VMware环境虚拟机的异地(Azure)容灾(下)
查看>>
也谈谈Apache与Nginx
查看>>
Word中使用正则表达式进行查找和替换
查看>>