本节讲述自定义目标识别的操作步骤和解析Vuforia自定义目标识别的代码含义,为后面设计做基础
注:本节使用Unity3D 2017.2,导入官网下载的Vuforia SDK实现
自定义目标识别操作步骤
1、要识别的物体放在ImageTarget下
2、ImageTarget——ImageTargetBehaviour Type设置为User Defined
3、将Vuforia——Perfabs里的UserDefinedTargetBuilder拖放置Hierarchy,勾选其组件的Start scanning automatically
Start scanning automatically:当场景加载完成后,应用就会自动扫描摄像头下的物体
4、新建脚本IUseDefined。挂载到UserDefinedTargetBuilder对象上。脚本在下文贴出。
IUseDefined脚本,具有让Vuforia使用眼前物体,将其作为Image Target、点击事件等功能
5、将ImageTarget赋值到IUseDefined
6、添加Button按钮,绑定IBuildNewTarget()方法
操作方法:
运行游戏,点击Button按钮,出现要识别的物体
自定义目标识别代码解析
代码语言:javascript复制using UnityEngine;
using Vuforia;
/// <summary>
/// 实现IUserDefinedTargetEventHandler
/// </summary>
public class IUseDefined : MonoBehaviour, IUserDefinedTargetEventHandler
{
//This class serves both as an augmentation definition for an ImageTarget in the editor as well as a tracked image target result at runtime
//需设置为ImageTarget,用于自身实例化、传递出识别图的宽度和名称信息
public ImageTargetBehaviour imageTargetTemplate;
//This Component can be used to create new ImageTargets at runtime. It can be configured to start scanning automatically or via a call from an external script. Registered event handlers will be informed of changes in the frame quality as well as new TrackableSources
//用于获取UserDefinedTargetBuildingBehaviour组件;
//用于将该类注册到事件系统中。当帧质量发生变化或有新的TrackableSources时就会告知事件系统(UserDefinedTargetBuildingBehaviour中的BuildNewTarget方法可产生告知事件系统new TrackableSource is available)。
private UserDefinedTargetBuildingBehaviour targetBuildingBehaviour;
//The ObjectTracker encapsulates methods to manage DataSets and provides access to the ImageTargetBuilder and TargetFinder classes
//ObjectTracker用于产生DataSet,可打开关闭数据集,将新的识别图记录到DataSet
private ObjectTracker objectTracker;
//DataSet,数据集,记录了上传Vuforia服务器中识别图的相关信息(识别图)。放在外面可以用于后面方法的关闭、打开数据集,给数据集添加信息
private DataSet dataSet;
//定义识别图数量,用于定义新增加的识别图的名字
private int targetCounter = 0;
//声明识别图的当前画质的变量,可用于将当前识别图画质引用赋值给该变量,做一些事情
public ImageTargetBuilder.FrameQuality currentQuality;
void Start()
{
targetBuildingBehaviour = GetComponent<UserDefinedTargetBuildingBehaviour>();
//将当前类注册到UserDefinedTargetBuildingBehaviour的事件系统
targetBuildingBehaviour.RegisterEventHandler(this);
}
/// <summary>
/// 在Vuforia初始化完成时调用
/// </summary>
public void OnInitialized()
{
// Returns the instance of the given tracker type See the Tracker base class for a list of available tracker classes. This function will return null if the tracker of the given type has not been initialized.
objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>(); //当能获取到时返回新实例,获取不到时返回null
if (objectTracker != null)
{
//创建新的dataSet
dataSet = objectTracker.CreateDataSet();
//激活dataSet
objectTracker.ActivateDataSet(dataSet);
}
}
/// <summary>
/// 当摄像头检测到图像质量发生变化时,由Vuforia自动调用
/// </summary>
public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality)
{
currentQuality = frameQuality;
}
/// <summary>
/// 当事件系统显示new TrackableSource is available时,将自动调用该方法。因为该特性所以该方法用于将识别图添加到数据集
/// 并且由于该方法和下面的方法涉及到事件系统,这是我们将该类注册到事件系统中去的原因
/// </summary>
/// TrackableSource:An opaque handle(不透明的句柄) for creating a new Trackable in a DataSet.
public void OnNewTrackableSource(TrackableSource trackableSource)
{
targetCounter ;
//取消激活数据集
objectTracker.DeactivateDataSet(dataSet);
//获取已经定义好的ImageTarget,并将其实例化,用于添加到数据集
ImageTargetBehaviour imageTargetCopy = Instantiate(imageTargetTemplate);
//imageTarget在Hierarchy实例化了但还没有名字,我们需给它定义一个名字
imageTargetCopy.gameObject.name = "UserTarget" targetCounter;
//Adds a single trackable from a source and a given gameobject to this dataset
//将实例化的新识别图Trackable赋值给数据集
//public abstract DataSetTrackableBehaviour CreateTrackable(TrackableSource trackableSource, GameObject gameObject);
dataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject);
objectTracker.ActivateDataSet(dataSet);
}
/// <summary>
/// 此方法绑定在按钮上,用于开始创建新对象(ImageTarget)并向事件系统发送new TrackableSource is available
/// 注意,是开始创建而不是该方法就能创建好了,它需要和OnNewTrackableSource配合使用
/// </summary>
public void IBuildNewTarget()
{
//创建新的target的名字,用于BuildNewTarget方法。上文创建的是新的ImageTarget的名字,用于在Hierarchy里显示
string targetName = string.Format(imageTargetTemplate.TrackableName targetCounter);
//This will start building a new target and report back to the event handlers as soon as a new TrackableSource is available.
//创建新对象
targetBuildingBehaviour.BuildNewTarget(targetName, imageTargetTemplate.GetSize().x);
}
}
注意事项:
1、不能激活导入的Vuforia Datasets
2、使用Vuforia官网下载的SDK时,Unity不要安装Vuforia组件