打开手机解锁人脸;VR和AR技术带来了这样一个虚拟而又真实的场景……3D视觉几乎无所不能,在智能家居、智能安防、汽车电子、工业测量、新零售、智慧物流等领域发挥着重要作用,可以堪称赋能产业创新的最大推力。这些技术背后都涉及到3D视觉相关的内容,那么计算机是如何“看到”三维世界的呢?随着信息技术的飞速发展,计算机视觉3D技术已经应用到很多领域,推动了虚拟现实(VR)、增强现实(AR)等技术的不断进步。3D视觉问题变得越来越重要,它提供了比2D更丰富的图像信息。如今,3D视觉技术带来的便利随处可见,如工业机器人、工件识别与定位、3D成像技术、产品虚拟设计、智能制造、自动驾驶、SLAM、无人机、3D重建、人脸识别等。都涉及到3D视觉相关的内容。3D视觉应用实例,来源:https://zhuanlan.zhihu.com/p/52049458综上所述,3D视觉是计算机视觉与计算机图形学高度交叉的一个重要研究方向。由于3D传感技术的快速发展和3D几何数据的爆炸式增长,3D视觉研究突破了传统的2D图像空间,实现了对3D空间的分析、理解和交互。我们生活在三维空间中,如何智能感知和探索外部环境一直是热门话题。2D视觉技术借助强大的计算机视觉和深度学习算法取得了超越人类认知的成就,而3D视觉由于算法建模和环境依赖等问题一直处于持续研究的前沿,3D信息能够真实反映物体而且环境的状态也更接近于人类的感知模式。随着技术的不断进步,3D视觉领域也取得了突飞猛进的进步,比如3D+AI识别功能,可以扫描人脸的3??D结构来解锁手机;在自动驾驶领域,通过分析3D人脸信息,判断驾驶员在驾驶时的情绪状态;SLAM通过重建周围环境完成建图和感知;AR领域通过3D重建技术完成目标的再现。那么这样实用的技术是如何实现的呢?在深入研究之前,让我们回顾一下3D视觉技术的一些基础知识。3D图像介绍在继续介绍3D图像之前,让我们简单回顾一下2D图像。我们在日常生活中看到的图像可以称为物理图像,不能被计算机直接识别,需要转换成数字格式,即数字图像。数字图像是二维图像中有限数量的数字像素的表示。由阵列或矩阵表示,其光的位置和强度都是离散的。它有两种存储方式:位图存储和矢量存储。常见的存储格式有PNG、GIF、JPEG、BMP等。二维图像可以分为二值图像、彩色图像等。二值图像中的每个像素可以用0(黑色)到255(白色)的亮度值表示).0-255之间代表不同的灰度级。彩色图像是三种不同颜色的灰度图像的组合,一种用于红色分量(R),一种用于绿色分量(G),一种用于蓝色分量(B)。图像颜色显示方法,RGB图像的三分量,来源:https://blog.csdn.net/Hello_Chan/article/details/89094790与二维图像类似,三维图像是基于二维彩色图像。一维,即深度(Depth,D),可以用一个很直观的公式表示:3D图像=普通RGB三通道彩色图像+深度图。RGB-DRGB-D是一种广泛使用的3D格式,其中图像的每个像素具有四个属性:即红色(R)、绿色(G)、蓝色(B)和深度(D)。深度图是3D图像特有的,指的是用于存储每个像素的位数,也用于衡量图像的颜色分辨率。确定彩色图像的每个像素可能的颜色数,或灰度图像的每个像素的灰度级数。它决定了彩色图像中可以出现的最大颜色数,或灰度图像中的最大灰度级。它的取值是有规律的,适合在已有的图像处理框架中直接使用。关于深度图的解释,例如,彩色图像的每个像素由R、G、B三个分量表示。如果每个分量用8位表示,那么一个像素共有24位,深度为像素是24。然后每个像素可以是16777216(224)种颜色之一。因此,像素深度可以理解为深度图像的距离值。代表一个像素的比特越多,它能表达的颜色就越多,它的深度也就越深。RGB-D图像格式,来源:https://www.sohu.com/a/249567571_114877在一般的基于像素的图像中,我们可以通过(x,y)坐标定位任意像素点,分别得到三个颜色属性(R,G、乙)。而在RGB-D图像中,每个(x,y)坐标将对应四个属性(深度D、R、G、B)。点云我们在做3D视觉的时候主要处理点云,点云是点的集合。与图像相比,点云有一个不可替代的优势——深度,也就是说,3D点云直接提供3D空间中的数据,而图像需要通过透视几何来反演3D数据。什么是点云?实际上,点云是一定坐标系下的点的数据集。一个点包含了丰富的信息,包括三维坐标X、Y、Z、颜色、分类值、强度值、时间等等。点云按组成特点分为两种,一种是有序点云,一种是无序点云。点云示例,图片来源:https://www.jianshu.com/p/ffedad5e8e30点云的获取:点云不是用普通相机拍摄得到的,一般是通过3D成像传感器获取的,比如双目相机,3D扫描仪、RGB-D相机等。目前主流的RGB-D相机有微软的Kinect系列、英特尔的realsense系列、结构传感器(需要配合iPad使用)等。可以将扫描后的数据生成点云RGB-D图像,以及扫描相机的固有参数,通过相机校准使用相机固有参数计算真实世界的点(x,y)。因此,RGB-D图像是网格对齐图像,而点云是稀疏结构。此外,更好的获取点云的方式还有LiDAR激光探测测量,主要通过星载、机载和地面三种方式获取。点云内容:根据激光测量原理得到的点云,包括三维坐标(XYZ)和激光反射强度(Intensity)、强度信息、表面材质、粗糙度、目标的入射角方向、目标的发射能量仪器,与激光波长有关。根据摄影测量原理得到的点云,包括三维坐标(XYZ)和颜色信息(RGB)。结合激光测量和摄影测量原理得到点云,包括三维坐标(XYZ)、激光反射强度(Intensity)和颜色信息(RGB)。点云的属性:空间分辨率、点精度、表面法向量等。虽然RGB-D相机应用广泛,但会受到很多硬件的限制。目前,深度相机输出的深度图存在很多问题。例如光滑物体、透明物体、半透明物体、深色物体等的表面反射都会导致深度图缺失。.而且很多深度相机缺少大面积的深度值,以后需要进一步的深度图补全操作。图片来源:https://www.cnblogs.com/CV-life/p/10105480.html上图是户外街道拍摄的点云图。如果仔细观察,可以清楚地看到建筑物和树木的轮廓。就上图而言,点云的优势可以归纳为以下几点:首先,点云可以表达物体的空间轮廓和具体位置,我们可以看到街道的形状和房子,物体和相机之间的距离也是已知的;其次,点云本身与视角无关,可以任意旋转,可以从不同的角度和方向观察一个点云,不同的点云只要在同一处就可以直接融合坐标系。接下来,放大点云,如下图,如果放大点云,你会看到最后是离散的点。即空间中成千上万的点组成了一个点集,这个点集构成了上面的街道和房屋。放大点云图,图片来源:https://www.cnblogs.com/CV-life/p/10105480.html点云的缺点从放大点云图的侧面反映出来,可以归结为有以下几点:3D点云比图像多了一个维度,即深度;点云分布不规则,比图像式规则网格更难处理;点云缺少图像中的纹理,而是一个孤立的点,会丢失很多信息。除此之外,点云是分布在空间(XYZ点)上的非结构化数据(无网格);在图像中,像素数是给定常数,具体取决于相机。但是,点云的数量可能会因各种传感器而有很大差异;点云的分辨率与相机的距离有关。不能近距离观察,只能从很远的角度整体观察。我们来看看点云结果的对比。原始RGB-D生成的点云结果如下:图片来源:https://zhuanlan.zhihu.com/p/42084058以下动图展示了深度图完成后生成的结果点云结果如下:来源:https://zhuanlan.zhihu.com/p/42084058点云数据存储格式点云存储文件格式有很多种。一些文件格式致力于标准化和通用性,现已得到多个相关软件或软件库的支持,也被大多数业内人士认可和使用。目前主要的点云存储格式包括:pts、LAS、PCD、.xyz和.pcap等,选择合适的通用格式可以更好地与其他工具乃至其他组织对接,从而提高工作效率。以下是点云数据存储格式的简要列表。pts点云文件格式是最方便的点云格式,直接按XYZ顺序存储点云数据,可以是整数也可以是浮点数。下图是截取的雕像点云的一部分。举例如下:LAS是激光雷达数据(LiDAR),存储格式比pts复杂。它旨在提供一种开放格式标准,允许不同的硬件和软件提供商输出可互操作的统一格式。LAS格式文件现在是LiDAR数据的行业标准格式。示例如下:LAS格式点云截图,其中C:class(班级),F:flight(航线编号),T:time(GPS时间),I:intensity(回波强度),R:return(多少timesecho),N:numberofreturn(回波次数),A:scanangle(扫描角度),RGB:红绿蓝(RGB色值)。图片来源:https://www.cnblogs.com/chenbokai/p/6010143.htmlPCD存储格式,现有文件结构不支持PCL库引入n维点类型(后面会介绍)由于对其自身的组成在机制处理方面进行了一些扩展,PCD文件格式对此进行了很好的补充。PCD格式有一个描述点云整体信息的文件头:定义点云的数量、大小、维度和数据类型的可读头;可以是ASCII或二进制的数据段。数据体部分由点的笛卡尔坐标组成,文本方式使用空格作为分隔符。PCD存储格式是PCL库官方规定的格式,典型的为点云量身定做的格式。优点是支持n维点类型扩展机制,可以更好的利用PCL库的点云处理性能。有两种文件格式,文本和二进制。示例如下:图片来源:https://cloud.tencent.com/developer/article/1475778.xyz文本格式,前3位数字代表点坐标,后3位数字为点的法向量,数字之间用空格隔开。举例如下:.pcap是一种常见的数据流格式,Velodyne出品的流行Lidar是默认的采集数据文件格式。它是一个二进制文件。数据结构如下:一个全局头(GlobalHeader)作为一个整体,然后分成若干个数据包(Packet),每个数据包包含一个头(Header)和一个数据(Data)部分。相应的基础算法库有海量数据支持不同格式的点云,需要专门的数据仓库进行展示和存储。例如,一张640x480的深度图可以转换成约30万个空间点的点云,大点云可达数百万甚至数千万,专门用于点云的读写、处理等各种操作数据存储库非常重要。PCL(PointCloudLibrary)库支持跨平台存储,可以部署在Windows、Linux、macOS、iOS和Android上。可适用于计算资源有限或内存有限的应用场景。它是一个大型的跨平台开源C++编程库。它实现了大量与点云相关的通用算法和高效的数据结构。它基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、过滤、分割、配准、检索、特征提取、识别、跟踪、曲面重建、可视化等操作,非常方便移动端开发。这里的common是指点云数据的类型,包括XYZ、XYZC、XYZN、XYZG等多种类型的点云。可以看出,低级点云处理主要包括过滤器、关键点和边缘检测。点云的中层处理是特征描述(feature)、分割(segment)和分类。高级处理包括注册和识别。除了PCL库,VCG库(VisulizationandComputerGraphicsLibrary)是专门为处理三角网格而设计的。该库非常大,提供了很多处理网格的高级函数,以及相对较少的点云处理函数。.CGAL(ComputationalGeometryAlgorithmsLibrary)旨在以C++库的形式提供方便、高效、可靠的几何算法。它实现了许多用于处理点云和网格的算法。Open3D是一个可以支持快速开发3D数据处理软件的开源库。支持快速开发用于处理3D数据的软件。Open3D前端公开了一组精心挑选的C++和Python数据结构和算法。后端经过高度优化并设置为并行化。Open3D是从头开始开发的,几乎没有经过仔细考虑的依赖项。它可以在不同的平台上设置,只需从源代码进行最少的编译。代码干净,风格一致,并通过清晰的代码审查机制进行维护。支持点云、网格、rgbd数据。本文是3D视觉的总结文章。介绍了几个重要的知识点,希望能在一定程度上帮助大家更深入地理解3D视觉。在接下来的文章中,我们将继续介绍3D视觉领域的算法实现。
