Vuforia实际应用中的相关方法

使用Vuforia开发AR程序中,时常遇到相机对焦,启用、关闭识别功能,动态加载识别特征等情况,下面总结一下以往开发过程中遇到的具体情况及使用的方法。

一、相机对焦

使用Vuforia时,偶尔会有晃动手机导致的画面模糊并且无法自动恢复的情况,特别是使用比较老的设备或设备本身摄像头像素较低,对识别影响很大。那么通过代码对相机进行设置,使得这种情况下能让相机重新对焦是很有必要的。方法很简单,Vuforia的SDK中,有一个CameraDevice类,是对相机的设置,其中包含SetFocusMode接口,使用这个接口可以设置相机对焦。实际应用过程中,发现网上说的调用CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);并不能实现模糊后再次对焦。经过一番搜索与尝试,最终使用如下方法,可以实现模糊后再次对焦。

    public void TriggerAutoFocus()
    {
        StartCoroutine(TriggerAutoFocusAndEnableContinuousFocusIfSet());
    }

    private IEnumerator TriggerAutoFocusAndEnableContinuousFocusIfSet()
    {
        CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);
        yield return new WaitForSeconds(1.0f);
        CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
    }

二、启用、关闭、重启识别

实际应用中,有时需要关闭识别功能,之后在需要的时候再启用识别,Vuforia同样有对应的方法。如下分享三个方法,分别时启用识别、关闭识别、重启识别,注意的是,网上有的帖子只说调用ObjectTracker的Start、Stop来实现,这样是不够的,应用中会发现,近操作识别的开启和停用,识别信息是保留的,因此不能实现关闭识别后没有识别数据或是开启后正常识别。需要对Data进行处理,开启前先要启用指定的识别数据,关闭后停用识别数据。

        public void StartRec()
        {
            var objTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
            if (objTracker != null)
            {
                foreach (DataSet dataset in objTracker.GetDataSets())
                {
                   objTracker.ActivateDataSet(dataset);
                }

                objTracker.Start();
            }

        }
        public void StopRec()
        {
            var objTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
            if (objTracker != null && objTracker.IsActive)
            {
                objTracker.Stop();

                foreach (DataSet dataset in objTracker.GetDataSets())
                {
                    objTracker.DeactivateDataSet(dataset);
                }

            }

        }
        public void RestartObjectTracker()
        {
            var objTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
            if (objTracker != null && objTracker.IsActive)
            {
                objTracker.Stop();

                foreach (DataSet dataset in objTracker.GetDataSets())
                {
                    objTracker.DeactivateDataSet(dataset);                   
                }

            }
        }

三、动态加载识别数据(以ImageTarget为例)

实际应用中,会有识别数据并不在一个库中,为的是针对不同识别场景,启用对应识别数据,而不会出现两种场景需要呈现不同内容,但是识别图相似,导致两种场景混淆。虽然这种情况不常出现,而且这种情况根本原因是程序应用环境的设计不合理。另一种需要动态加载的场景是,识别数据保存在云端,程序中仅下载需要用到的数据,然后加载进来进行识别。可能觉得这种情况使用云识别就好了,但是考虑到云识别首先存在延迟,其次若是网络环境不好的情况下,云识别可能不能满足应用,这是通过从云端下载一次数据,之后使用本地识别,对用户来说体验感要优于云识别。

    void LoadDataSet(string dataSetName)
    {
        ObjectTracker objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();

        DataSet dataSet = objectTracker.CreateDataSet();

        if (dataSet.Load(dataSetName))
        {
            objectTracker.Stop();//这里必须要停止跟踪才能激活DataSet
            objectTracker.ActivateDataSet(dataSet);
            objectTracker.Start();

            int counter = 0;

            IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours();
            foreach (TrackableBehaviour tb in tbs)
            {
                if (tb.name == "New Game Object")
                {

                    tb.gameObject.name = ++counter + ":DynamicImageTarget-" + tb.TrackableName;

                    tb.gameObject.AddComponent<DefaultTrackableEventHandler>();
                    tb.gameObject.AddComponent<TurnOffBehaviour>();

                }
            }
        }
        else
        {
            Debug.LogError("<color=yellow>Failed to load dataset: '" + dataSetName + "'</color>");
        }
    }

调用时可以直接调用此方法,或使用注册事件的形式,使用RegisterVuforiaStartedCallback()。直接调用可以传参,比较灵活,使用回调则需要增加变量来指定启用的数据包名称。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值