ARCore之路-环境理解之网格

版权声明:David Wang原创ARCore文章,仅供学习研究之用,不得用于任何商业目的,未经授权不得转载! https://blog.csdn.net/yolon3000/article/details/82764526

  前一节,我们对特征点及点云进行了学习了解,特征点对机器视觉来说是重要的评估依据,同时,对我们来说,能够识别环境视觉上的特征点或物体的轮廓只是我们了解用户周围环境的开始。我们真正想要做的是使用这些特征点来帮助我们识别平面、曲面或已知对象的信息及其位置。
  ARCore通过使用网格(Meshing)的技术为我们自动识别平面或曲面。在前面,我们已经学会了利用ARCore来检测平面并可视化平面,但再进一步学习之前,我们还是有必要了解一下关于网格的更基本的信息。

一、网格

这里写图片描述

  ARCore利用视觉中检测到的特征点信息来尝试构建平面,这个过程称为网格化(Meshing),如果特征点信息符合一定的规律,则认为这些特征点构成了一个平面,并将这个平面网格化成平面网格,网格是3D虚拟数字中最基本的元素,有了网格,我们就可以进行碰撞、渲染等后续操作,通常检测到的平面网格会被渲染到场景中,如果在前面的例子中,我们足够认真,我们已经了解了平面是如果被检测到并被渲染出来。
  在上图中,左图是示例的特征点值图,右图是网格化后的Mesh,在GPU渲染网格时,组成网格的三角形的三个顶点的位置是有序的,通常如图中所示的逆时针排序方式朝外的一面称为正面,朝内的那面称为背面,这个排序方式对我们后续的渲染、光照、背面剔除会有很大的影响,如上图132排序与123排序那么这个三角面的法向是相反的,由此阴影、光照、背面剔除也是相反的,当然,现在的建模软件会处理这些问题,但如果我们要手动建立网格,或者由算法生成网格,那个环绕方向是值得注意的。

二、平面可视化

   平面可视化是为了让用户了解哪些平面已经被ARCore检测到,也是为下一步放置物体、承载对象提供一个用户可以直观看到的基础面。平面可视化在前面的章节中我们已经学习并用两种方法实现过,这里就不再赘述。

这里写图片描述
这里写图片描述

三、ARCore的平面检测

  好了,现在我们了解了平面是如何产生和渲染的。实际上,这些工作都是由ARCore自动完成的,我们并不需要参与,具体算法如何已经超出了本文的范畴。在前面的阐述中,我们也知道了,ARCore的平面检测是基于特征点的,而这些特征点又是图像中视觉差异明显的点,所以我们也就很清楚的可以看到ARCore在平面检测上的局限性:
  1、无法检测无特征平面。
  无特征或者弱特征平面的特征点不够明显,如白墙、强反光镜面、低纹理地板等等,由于无法检测到特征点,自然无法构建平面。
  2、无法检测非稳定平面
  ARCore的平面检测需要比较稳定且符合一定规格的特征点,如果我们对着播放着的电视、阴影婆娑摆动的路面、波光粼粼的水面,由于这些特征点变化剧烈,不够稳定,构建平面也就比较困难。
  3、无法检测曲面
  目前来看,ARCore还无法检测曲平面,如锅面、内圆面等等,当然,这个随着算法的改进是有可能解决的。
  4、检测到的平面边界不够精准
  由于机器视觉的缘故,目前还不能很精准的检测到平面的边界,这在实际应用中就会出现平面穿越物体延伸、平面过大或过小的问题。

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/82764526