玩转3D视界:3D机器视觉及其应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 如何玩转3D视界

玩转3D视界需要具备哪些知识呢?

“工欲善其事,必先利其器。”要想玩转3D视界,必须要有一台能够获取3D数据的设备,也就是这里要给大家介绍的3D相机。目前市面上常用的3D相机很多,根据测距原理的不同可以分为三种,分别是双目立体相机、结构光相机和飞行时间(Time-of-Flight,ToF)相机。其中,双目立体相机是双摄像头,结构光相机和ToF相机则是单摄像头。结构光相机发射的是结构化的光源,如光点、光线、光面等,而ToF相机则是向目标物体发射脉冲激光或连续波激光。每种相机的测距方式都有各自的特性,在不同的应用场景中也各有优劣,三种3D相机的选择也需要根据具体的需求而定。

本书基于ToF相机,介绍配套的底层开发工具包SDK和算法开发平台DMAPP。DMAPP平台是上海数迹智能科技有限公司(简称“上海数迹”)开发的算法平台,支持多平台、多语言开发,支持Windows、Linux、Android多种操作系统,同时支持Python、C、C++等多种编程语言。开发者在使用时只需要调用封装好的函数,可减少基础算法的学习时间,降低实现难度,有效提高工作效率。

准备好设备和平台后,若想要快速高效地完成任务,大家必须对数据的存储结构、不同数据结构的特性等有深入的了解,这样才能更好地利用数据、表示数据。或许你已经了解过传统的数据结构,如堆栈、树、队列等,但3D数据结构与这些不同,3D数据的表示方法通常比较直观且易于理解,其中还有一些是2D数据的扩展。常见的3D数据表示方法有很多,如点云、体素、多边形网格等,而最容易理解的就是深度图了。深度图是一种类似于灰度图的表示方法,不同的是,深度图的每一个像素记录的是物体距离相机镜头的实际距离值,而不是灰度值。而且深度图可以通过前面提到的3D相机直接得到,不需要进行其他额外的转换和处理。不同的3D数据结构之间可以互相转换,不同的数据表示方式有各自适用的应用场景,例如,体素可以用于医学成像、美术设计等场景。大家在深入理解3D数据后,可以根据应用场景自由地选择不同的数据表示方法,甚至可以自己构建新的方法。

但以上内容还不足以支撑我们玩转3D视界,因为我们要面对一个很现实的问题,那就是数据本身并不是理想的。如果你之前学习过图像处理的相关知识,就会知道,在2D图像处理的过程中会存在噪声和冗余等问题。同样,在3D数据的采集过程中,总会因为各种不可控的因素,导致采集的数据中存在噪声或误差。例如,当某个像素的深度值受到干扰而产生误差时,在转换成点云后,该点会出现在点集外部,这种就是飞散点,是我们不希望看到的。

3D相机采集的数据必然会存在误差,这些误差从来源上可以分为两类:系统误差和非系统误差。系统误差是由相机本身的内部结构引起的,而非系统误差则是由外部因素造成的。为了消除这些误差或者减少噪声对后续应用的干扰,需要采用滤波器。滤波器的设计和数据表示方法有关,基于深度图的滤波器和传统的2D滤波器类似,常见的有空域滤波器和时域滤波器,空域滤波包括高斯滤波、中值滤波、双边滤波等,时域滤波包括滑动平均滤波、自适应帧间滤波等。此外,还有基于点云的滤波器,其针对映射到3D空间中的点云,如体素滤波器、统计过滤器、半径过滤器等。滤波器可以在一定程度上减少图像噪声的干扰,而数据的冗余则需要通过数据压缩来解决。无效的冗余信息的剔除、高传输效率和低空间占用率是未来3D应用领域的基本需求。3D数据的压缩也可以分为两类:深度图的压缩和深度视频序列的压缩,但目前都还处于发展阶段,远不如2D图像压缩算法成熟,本书所述内容仅供大家学习和参考。