官方教程 收藏本版 已有2人收藏 +发表新主题
查看: 14419|回复: 0
打印 上一主题 下一主题

metaio SDK 官方教程--官方范例之3D Tracking(Advanced Features...)

[复制链接]

metaio SDK 官方教程--官方范例之3D Tracking(Advanced Features...)

Luc_metaio 发表于 2014-5-12 10:17:04 浏览:  14419 回复:  0 只看该作者 复制链接
可视检测的使用和效果

使用Creator 3.0自带EdgeConfig工具制作的固定视角AR场景并不需要进行可视检测,因为用户只会在一个角度来观测模型。但是,由于线模型是在宽角度下合成的,有些线条很有可能在摄像头的某些角度下无法观测到。有这种瑕疵是正常的,不过,这种瑕疵会降低初始化效果并且会使效果阀值很难确定。



上图线模型的红线部分在一些角度可以被观测到,但是在图中特定角度下,他们被遮挡住了。由于系统无法确认红线部分是否存在于摄像头图像中,初始化的质量数值会减小。也就是说,如果一个模型包含很多突出或凹陷的部分,那么不使用可视测试的话,初始化的质量会有很大变化。

您可以采取以下两种方法来应对:
  • 在跟踪配置文件中降低最低质量阀值,这也许会导致初始化的偏误
  • 在跟踪配置文件中开启可视检测。系统会在每帧画面中检测到被遮挡的部分,并使跟踪质量的评估趋于稳定。但是,如果表面模型过于复杂(三角元数量过千),那么可视检测会降低跟踪性能。



什么样水平的线模型复杂度比较合适?

在使用Creator 3.0自带EdgeConfig工具制作模型时,高分辨率的模型可以加强线模型的制作效果。然而,导出的表面模型是通过把原有模型转化成三角元并削除材料信息制成的。

一般来说,如果模型只用于特征点的提取,而不进行可视检测(遮挡检测),那么模型的复杂度可忽略不计。因此,在大部分固定视角应用中,用户不需要确保制作的表面模型在不同角度下都正确。也就是说,固定视角模式下使用的模型只包含一个角度的表面就可以。但是,在自由视角或其他需要进行可视检测的模式下,系统需要使用非常精细的模型,所以我们需要对其进行尽可能的精简。

  • 首要原则:

如果不需要进行可视检测,您可以使用原来的3D模型,将其转化成三角元并去除材料信息即可。如果转换到无标识3D跟踪模式花费太多的时间,您可以对表面模型进行精简

如果必须使用可视检测,您可以使用三角元在至少一个角度下制作小型的纯表面模型。这就意味着您需要删除内部表面,并在保留模型结构的同时,尽量减少三角元的数量。



使用设备重力信息来辅助初始化

一般来说,只有在室外模式下才要求使用移动设备的所有传感器(GPS和惯性传感器)。但是,如果在跟踪配置文件中把<UseSensorsForPoseCreation>设置为gravity,那么系统可利用重力传感器在任何模式下旋转并移动设备,来调整摄像头对模型的视角,从而免除用户手动操纵的烦恼。

这样一来,虚拟摄像头对平面上模型的视角会永远和设备摄像头的视角保持一致

重要提示:使用设备提供的重力信息来进行初始化要求模型的Z轴必须朝上,否则,模型会在屏幕上摆放歪斜



在动态环境下跟踪

默认情况下,边缘初始化后,无标识3D跟踪会跟踪整个环境。这会使跟踪效果非常稳定。

但如果实物周围的环境是不断变化的,或者实物本身在移动或旋转,特征跟踪就会失败

如果在跟踪配置文件中设定如下参数,那么3D跟踪会执行narrow特征图延伸,并只会跟踪表面模型上的特征
  1. // XML

  2. <Sensor Type="EdgeBasedInitializationSensorSource">
  3. <Parameters>   
  4.   <FeatureTracking>
  5.    <Parameters>
  6.     <MapExtensionMethod>narrow</MapExtensionMethod> <!-- "wide" or "narrow" -->
  7.    </Parameters>
  8.   </FeatureTracking>
  9. </Parameters>
  10. </Sensor>
复制代码
此模式允许实物在环境中相对移动,也允许物体周围的整个环境有些许变化。然而,如果模型太小或纹理性不强,这种跟踪有可能会失败



微调参数

尽管基于边缘初始化的大部分参数都是通用的,有三个重要参数依赖于场景和模型。它们是:(1)接受初始姿态的质量阀值;(2)线模型上所使用的特征数量;(3)用其匹配图像边缘的查找范围。因此,除了跟踪配置文件模板中的默认参数值,您需要根据具体情况调整以上三个参数的数值。您可以在跟踪配置文件中开启EdgeBasedInitializationSensorSource的测试模式来轻松调整并测试这些参数
  1. // XML

  2. <Sensor Type="EdgeBasedInitializationSensorSource">
  3. <Parameters>   
  4.   <InitializationTestMode>true</InitializationTestMode> <!-- "false" or "true" -->
  5. </Parameters>
  6. </Sensor>
复制代码
如果测试模式处于开启状态,系统不会转换到无标识3D跟踪。所以,系统会触发ETS_FOUND或ETS_LOST跟踪事件,而不会触发ETS_REGISTERED。系统会在每帧中尝试初始化给定的姿态估测(空跟踪或GPS)。这种应用方式可以在运行时刻修改微调参数,并立即观测到参数修改的效果,从而让我们轻松找到最合适的参数值。
  1. // javascript

  2. //Change mode parameters (result will be the new mode if successful)
  3. arel.Scene.sensorCommand("setVisibilityTestEnabled", "off"); // "off" or "on"
  4. arel.Scene.sensorCommand("setSensorUsage", "off"); // "off", "gravity" or "all"

  5. //Change tuning parameters (result will be "Done" if successful)
  6. arel.Scene.sensorCommand("setNumFeatures", "500"); // should be > 100
  7. arel.Scene.sensorCommand("setSearchRange", "50"); // in [mm]
  8. arel.Scene.sensorCommand("setMinQuality", "0.7"); // should be in [0.55, 0.85]
复制代码
  1. // java

  2. String result;
  3. //Change mode parameters (result will be the new mode if successful)
  4. result = metaioSDK.sensorCommand("setVisibilityTestEnabled", "off"); // "off" or "on"
  5. result = metaioSDK.sensorCommand("setSensorUsage", "off"); // "off", "gravity" or "all"

  6. //Change tuning parameters (result will be "Done" if successful)
  7. result = metaioSDK.sensorCommand("setNumFeatures", "500"); // should be > 100
  8. result = metaioSDK.sensorCommand("setSearchRange", "50"); // in [mm]
  9. result = metaioSDK.sensorCommand("setMinQuality", "0.7"); // should be in [0.55, 0.85]
复制代码
  1. // objective c

  2. std::string result;
  3. //Change mode parameters (result will be the new mode if successful)
  4. result = m_metaioSDK->sensorCommand("setVisibilityTestEnabled", "off"); // "off" or "on"
  5. result = m_metaioSDK->sensorCommand("setSensorUsage", "off"); // "off", "gravity" or "all"

  6. //Change tuning parameters (result will be "Done" if successful)
  7. result = m_metaioSDK->sensorCommand("setNumFeatures", "500"); // should be > 100
  8. result = m_metaioSDK->sensorCommand("setSearchRange", "50"); // in [mm]
  9. result = m_metaioSDK->sensorCommand("setMinQuality", "0.7"); // should be in [0.55, 0.85]
复制代码
  1. // C++

  2. String result;
  3. //Change mode parameters (result will be the new mode if successful)
  4. result = m_pMetaioSDK->sensorCommand("setVisibilityTestEnabled", "off"); // "off" or "on"
  5. result = m_pMetaioSDK->sensorCommand("setSensorUsage", "off"); // "off", "gravity" or "all"

  6. //Change tuning parameters (result will be "Done" if successful)
  7. result = m_pMetaioSDK->sensorCommand("setNumFeatures", "500"); // should be > 100
  8. result = m_pMetaioSDK->sensorCommand("setSearchRange", "50"); // in [mm]
  9. result = m_pMetaioSDK->sensorCommand("setMinQuality", "0.7"); // should be in [0.55, 0.85]
复制代码
  1. // XML

  2. <Sensor Type="EdgeBasedInitializationSensorSource">
  3. <Parameters>   
  4.   <!-- this is only a subset of all parameters for tuning and mode selection -->
  5.   <TriangleMesh>SurfaceModel.obj</TriangleMesh>
  6.   <UseSensorsForPoseCreation>off</UseSensorsForPoseCreation> <!-- "off", "gravity" or "all" -->
  7.   <EdgeAlignment>
  8.    <LineModel>LineModel.obj</LineModel>
  9.    <MinQuality>0.7</MinQuality> <!-- should be in [0.55, 0.85] -->
  10.    <SearchRange>50</SearchRange> <!-- in [mm] -->
  11.    <NumFeatures>500</NumFeatures> <!-- should be bigger than 100 -->
  12.    <VisibilityTest>
  13.     <Enabled>off</Enabled> <!-- "off" or "on" -->
  14.    </VisibilityTest>
  15.   </EdgeAlignment>
  16. </Parameters>
  17. </Sensor>
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享至:
| 人收藏
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.