Vufoia——动态添加、删除识别数据集
来源:互联网 发布:淘宝上有铁匠铺吗 编辑:程序博客网 时间:2024/06/13 08:15
这篇文章主要介绍和实现的内容如下:
- 动态添加删除Vufoia识别数据集目的
- Vufoia识别数据集相关介绍
- 如何动态(运行状态)添加数据集
- 如何动态(运行状态)删除数据集
动态添加删除Vufoia识别数据集目的
- 优势1
用户可在程序运行是更新、删除识别图,做到识别图热更新
- 优势2
Vufoia在进入AR场景时,会存在物理摄像机开启及加载本地设别图数据的过程,如果在程序一开始时,通过ARCamera自动添加所有的数据集,程序在移动端测试会出现卡顿情况;然后动态添加删除Vufoia识别数据集,可以做到在需要的地方添加所需要的数据集,较少卡顿现象
- 优势3
对原有数据集中相关信息可修改操作,增加灵活性,实用性
Vufoia识别数据集相关介绍
- DataSet
记录了上传Vufoia服务器中识别图的相关信息
如何得到Vufoia中的文件
- 方法一:
- 在Vufoia官网开发者中下载所上传的识别图方法一:
传统方法,我们在Unity中下载Database都会选择下载.unitypackage格式文件,即选择Unity Editor方式下载,再导入到Unity工程中,得到识别图数据集,这个方法会在下面介绍。
下载完成后会得到一个.zip文件,将其解压得到: - First.dat文件记录了设别图的相关信息如设别点信息等
- First.xml文件记录了设别图的名字、尺寸信息等,如下所示:
- 方法二:
在Vufoia官网开发者中下载所上传的识别图方法二:
下载完成后将得到一个First.unitypackage文件,导入Unity:
在StreamingAssets/QCAR路径下将得到相应的文件。
如何动态(运行状态)添加数据集
代码块
static ObjectTracker objectTracker; static DataSet dataSet; public static void LoadDataSet(string DataPath,Action<Hashtable> CustomSendMessage) { if (CustomSendMessage == null) { CustomSendMessage = NullCustomSendMessage; } objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>(); dataSet = objectTracker.CreateDataSet(); if (dataSet.Load(DataPath,DataSet.StorageType.STORAGE_ABSOLUTE)) { objectTracker.Stop(); // stop tracker so that we can add new dataset if (!objectTracker.ActivateDataSet(dataSet)) { Debug.Log("<color=yellow>Failed to Activate DataSet: " + DataPath + "</color>"); CustomSendMessage(HashtableEX.Construct( "Success", false )); } else if (!objectTracker.Start()) { Debug.Log("<color=yellow>Tracker Failed to Start.</color>"); CustomSendMessage(HashtableEX.Construct( "Success", false )); } else { IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours(); foreach (TrackableBehaviour tb in tbs) { if (tb.name == "New Game Object") { tb.gameObject.name = tb.TrackableName; tb.gameObject.AddComponent<CustomTrackableEventHandle>(); tb.gameObject.AddComponent<TurnOffBehaviour>(); //tb.gameObject.GetComponent<ImageTargetBehaviour>().SetWidth(0.1f); } } CustomSendMessage(HashtableEX.Construct( "Success",true, "Trackables",tbs )); } } else { Debug.LogError("<color=yellow>Failed to load dataset: '" + DataPath + "'</color>"); CustomSendMessage(HashtableEX.Construct( "Success", false )); } }
注意事项:
- DataPath:在移动端需要动态下载更新时,DataPath路径需要在Application.persistentDataPath相关路径中,原因文件下载后一般下载路径都存放在该路径中,而且不能使用文件操作移动到其他路径下面。
- Action CustomSendMessage:是消息机制,操作完加载数据集后反馈相应消息(成功 or 识别)
如何动态(运行状态)删除数据集
代码块
/// <summary> /// Destory Old DateSet and ImageTarget Object /// </summary> public static void DestroyDateObject() { try { var objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>(); var dataSet = objectTracker.GetActiveDataSets(); if (dataSet!=null) { List<DataSet> t = new List<DataSet>(dataSet); while (t.Count > 0) { var i = t[0]; t.Remove(i); objectTracker.DeactivateDataSet(i); objectTracker.DestroyDataSet(i, false); var trackables = i.GetTrackables(); foreach (var item in trackables) { TrackerManager.Instance.GetStateManager().DestroyTrackableBehavioursForTrackable(item, true); } } } } catch(Exception e) { Debug.Log(e.ToString()); } }
注意事项:
- 第一:List t = new List(dataSet);为什么需要转换为一个List,而不直接使用foreach循环删除操作:foreach中只能读取数据,而不能删除数据。
- 第二:如果使用for循环,此处需要从大到小循环,不然在后面移除掉某一项之后,将会出现错误。
完整代码如下
代码块
using UnityEngine;using System.Collections;using Vuforia;using System.Collections.Generic;using System;/// <summary>/// 动态添加数据集/// </summary>public class LoadDate{ static ObjectTracker objectTracker; static DataSet dataSet; static bool isFirst = true; public static void LoadDataSet(string DataPath,Action<Hashtable> CustomSendMessage) { if (CustomSendMessage == null) { CustomSendMessage = NullCustomSendMessage; } //if (isFirst == false) //{ DestroyDateObject(); //} objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>(); dataSet = objectTracker.CreateDataSet(); if (dataSet.Load(DataPath,DataSet.StorageType.STORAGE_ABSOLUTE)) { objectTracker.Stop(); // stop tracker so that we can add new dataset if (!objectTracker.ActivateDataSet(dataSet)) { Debug.Log("<color=yellow>Failed to Activate DataSet: " + DataPath + "</color>"); CustomSendMessage(HashtableEX.Construct( "Success", false )); } else if (!objectTracker.Start()) { Debug.Log("<color=yellow>Tracker Failed to Start.</color>"); CustomSendMessage(HashtableEX.Construct( "Success", false )); } else { IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours(); foreach (TrackableBehaviour tb in tbs) { if (tb.name == "New Game Object") { tb.gameObject.name = tb.TrackableName; tb.gameObject.AddComponent<CustomTrackableEventHandle>(); tb.gameObject.AddComponent<TurnOffBehaviour>(); //tb.gameObject.GetComponent<ImageTargetBehaviour>().SetWidth(0.1f); } } CustomSendMessage(HashtableEX.Construct( "Success",true, "Trackables",tbs )); } } else { Debug.LogError("<color=yellow>Failed to load dataset: '" + DataPath + "'</color>"); CustomSendMessage(HashtableEX.Construct( "Success", false )); } isFirst = false; } /// <summary> /// Destory Old DateSet and ImageTarget Object /// </summary> public static void DestroyDateObject() { try { var objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>(); var dataSet = objectTracker.GetActiveDataSets(); if (dataSet!=null) { List<DataSet> t = new List<DataSet>(dataSet); while (t.Count > 0) { var i = t[0]; t.Remove(i); objectTracker.DeactivateDataSet(i); objectTracker.DestroyDataSet(i, false); var trackables = i.GetTrackables(); foreach (var item in trackables) { TrackerManager.Instance.GetStateManager().DestroyTrackableBehavioursForTrackable(item, true); } } } } catch(Exception e) { Debug.Log(e.ToString()); } } static void NullCustomSendMessage(Hashtable NullHashTable) { }}
0 0
- Vufoia——动态添加、删除识别数据集
- Vufoia动态添加模型、视频、透明视频
- Listview动态添加/删除数据
- Listview动态添加/删除数据
- Android25闹钟项目——ArrayAdapter动态添加数据,显示数据,删除数据SharedPreferences存储数据,读取数据
- js动态添加删除,后台取数据
- jquery动态添加删除一行数据
- AngularJS动态添加数据并删除
- extjs4 grid 多选、添加复选框、动态添加删除数据
- extjs4 grid 多选、添加复选框、动态添加删除数据
- 市委组织部考核项目——动态添加,删除行
- 安卓——ListView的动态添加与删除
- android ListView内数据的动态添加与删除
- android ListView内数据的动态添加与删除
- android ListView内数据的动态添加与删除
- Hadoop2.x集群动态添加删除数据节点
- JQuery动态添加删除行并存储数据
- android ListView内数据的动态添加与删除
- Activiti Study
- 『python工作』matplotlib 库的一些注意点
- Droidbox环境搭建
- 坚持做好一件事之开博客
- 导航条显示隐藏控制
- Vufoia——动态添加、删除识别数据集
- Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
- iOS之PJSIP的编译与简单使用
- JDK并发数据结构
- 详解android中AsyncTask的使用
- 【缓存策略】Retrofit+OkHttp实现缓存处理
- ORACLE_HOME目录满了 导致的ORA-01114 ORA-29701的问题
- nginx 已有80端口服务如何在开启一个非80端口的静态资源指向
- phpmyadmin里root无法登陆的临时解决办法