深度剖析三维数据基础

描述

 

1 三维数据的采集方式

1.1 激光扫描仪

激光扫描仪(Lidar)是一种常用于采集三维数据的仪器,它使用激光光束进行测量和感知,通过发射激光束并测量其返回时间和强度来获取目标物体的距离和形状信息,并计算出每个扫描点的准确坐标。这些点的集合形成了三维点云数据。激光扫描仪可大面积、高分辨率、快速地获取物体表面各个点的(x,y,z)坐标、反射率、(R.G.B)颜色等数据信息,可以快速复建出1:1彩色三维点云模型,用于后续的三维重建、建模和测量分析等应用。

1.2 深度相机

传统的RGB彩色普通相机称为2D相机,只能拍摄相机视角内的物体,没有物体到相机的距离信息,只能凭感觉感知物体的远近,没有明确的数据。而RGB-D深度相机(又称3D相机,其中D代表Depth为深度信息)可获取物体到相机的距离信息,加之2D平面的X,Y坐标,可计算出每个点的三维坐标,进行三维重建、目标定位、识别等应用。

1.3 双目相机

双目相机,也称为立体视觉相机或双目立体视觉系统,是一种通过两个摄像头同时拍摄来模拟人类双眼视觉的相机系统。每个摄像头都可以独立地捕捉场景的图像,然后通过计算机算法将这些图像进行立体视觉匹配,从而得到场景深度信息。通过测量摄像头对应像素上图像的位移,结合摄像头之间的已知基线长度,可以使用三角测量原理计算出场景中点的三维位置。这使得双目相机在许多应用领域中非常有用,例如三维重建、立体视觉测距、物体识别和跟踪等。

1.4 光学相机多视角重建

使用相机拍摄物体的多张照片,再通过相关三维重建软件将照片配准定位,进行特征提取与匹配,随后生成稀疏点云并进行稠密重建操作。SFM是指通过分析多个二维图像之间的共同点和摄像机运动信息,推导出场景的三维结构。基本的假设是,同一场景的不同图像是通过摄像机在空间中移动而产生的。SFM利用这些视角和对应点之间的几何关系,通过三角定位、尺度恢复、摄像机运动估计等算法,将这些视角投射到一个共同的三维坐标系中。多视角重建这类软件有Agisoft Photoscan、VisualSFM等。

激光光束

**

2 三维数据的采集原理

2.1 三角测距

三角测距是一种常用的测量方法,基于三角形的相似性原理进行测量。其原理可以简化为以下几个步骤:

  1. 建立一个已知长度的基准线段:在测量前,建立一个已知长度的基准线段。
  2. 观测目标物体和基准线段之间的角度:使用测量仪器,测量目标物体和基准线段之间的两个角度。这可以通过对目标物体和基准线段分别放置测量仪器来实现。
  3. 计算距离:利用三角形的相似性原理,通过已知角度和基准线段长度,根据三角函数的关系,可以推导出目标物体到观测点的距离。
 

激光光束

image.png

2.2 TOF

TOF(Time of Flight)是一种基于光的测距技术,通过测量光信号从发射到接收所需的时间来确定物体到传感器之间的距离。以下是TOF的工作步骤:

  1. 发射光脉冲:传感器发射一个光脉冲,这个光脉冲会被物体反射或散射。
  2. 接收光信号:传感器接收并记录反射或散射的光信号。这个信号在光脉冲返回传感器之后,经过一段时间才能被接收到。
  3. 测量时间差:通过测量光脉冲发射和接收之间的时间差,即发射光脉冲和接收到反射或散射光信号之间的时间间隔,确定物体到传感器之间的距离。
  4. 计算距离:根据光在真空中的传播速度(一般取光速),将测量得到的时间差转换为距离。

TOF的优点是测量精度高、测量范围广,可以应用于不同的环境和物体表面。它在工业、机器人、自动驾驶等领域被广泛应用。

激光光束

2.3 双目视觉

双目视觉是一种基于人类双眼感知深度的视觉技术。它模拟了人类的双眼视觉系统,通过两个相距一定距离的摄像头来获取两个不同角度的图像,并通过计算两个图像之间的视差(disparity)来推断物体的距离和深度信息。以下是双目视觉的工作步骤:

  1. 摄像头安装:两个摄像头以一定距离安装在同一平面上,使得视野有一定的重叠区域。
  2. 图像获取:通过两个摄像头分别获取两个不同角度的图像,类似于人的双眼。
  3. 图像校正:根据摄像头的内外参数,对两个图像进行校正,以消除图像畸变和对齐两个摄像头的视图。
  4. 匹配特征点:在两个校正后的图像中,通过特征点提取算法(如SIFT、SURF等)找到两个图像中具有相似特征的点。
  5. 计算视差:对于找到的匹配特征点,计算它们在两幅图像中的水平位置差异,这个差异称为视差。视差值越大,表示物体距离摄像头越近;视差值越小,表示物体距离摄像头越远。
  6. 距离计算:通过已知的摄像头参数、基线距离和三角测量原理,将视差转换为物体的距离值。距离值随着视差的增大而减小,反映物体与摄像头的距离远近。

双目视觉在机器人导航、三维重建、物体识别和跟踪等领域得到广泛应用,能够提供精确的深度信息,以增强对环境的感知能力。

激光光束

2.4 结构光

结构光是一种常见的三维感知技术,其原理基于对物体表面投射结构光,并通过相机来捕捉和分析光的形状和变化。以下是结构光测量的原理步骤:

  1. 投射结构光:在测量区域的一侧,使用光源(通常是激光器或投影仪)发射结构化的光,例如光栅纹理、条纹或编码图案。
  2. 光的投射和形变:结构光经过测量区域后,会与物体表面的形状和纹理相互作用。光在物体表面上会发生投影、反射和散射等变化。物体表面的形状和纹理会导致结构光的形变。
  3. 形变捕捉:在测量区域的另一侧,放置相机或传感器来捕捉反射、散射或投影的结构光。相机记录下物体表面的结构光形变和模式。
  4. 形变分析:通过分析相机捕捉到的结构光图像,可以反推出物体表面的形状和尺寸。这可以通过计算结构光的位移、形变或纹理变化进行实现。
  5. 三维重建:通过相机捕捉到的结构光图像,以及对光源和相机之间的几何关系,进行三维重建,将物体表面的形状和纹理转化为一个三维模型或点云数据。
 

激光光束

image.png

3 点云基础

3.1 点云概念

点云(Point Cloud)是三维空间中,表达目标空间分布和目标表面特性的点的集合,点云通常可以从深度相机中直接获取,也可以从CAD等软件中生成。点云是用于表示多维点集合的数据结构,通常用于表示三维数据。在3D点云中,这些点通常代表采样表面的X,Y和Z几何坐标。当存在颜色信息时,点云变为4D。

 

激光光束

 

根据激光测量原理得到的点云,包含三维坐标信息(xyz)和激光反射强度信息(intensity)(激光反射强度与仪器的激光发射能量、波长,目标的表面材质、粗糙程度、入射角相关)。根据摄影测量原理得到的点云,包括三维坐标(xyz)和颜色信息(rgb)。结合两个原理的多传感器融合技术(多见于手持式三维扫描仪),能够同时得到这三种信息。三维点云是真实物体表面的离散采样,点云处理就是从点云中提取到我们需要的信息。

3.2 点云类型

为了涵盖能想到的所有可能的情况,PCL中定义了大量的point类型,在point_types.hpp中有完整目录。

  1. PointXYZ - Members: float x, y, z

最常用的数据类型之一,只表示3D xyz信息。用户可以访问点[i].data[0]或点[i].x

union
{
 float data[4];
  struct
  {
   float x;
   float y;
   float z;
  };
};
  1. PointXYZI - Members: float x, y, z, intensityXYZ+强度类型。由于大多数点操作会将data[4]数组的第四部分设置为0或1(用于转换),因此不能将intensity设置为同一结构的成员,因为它的内容将被覆盖。
union
{
  float data[4];
  struct
  {
   float x;
   float y;
   float z;
  };
};
union
{
 struct
  {
    float intensity;
  };
  float data_c[4];
};
  1. PointXYZRGBA - Members: float x, y, z; std::uint32_t rgba与PointXYZI类似,除了rgba包含打包成无符号32位整数的rgba信息外。由于联合声明,还可以按名称单独访问颜色通道。
union
{
 float data[4];
 struct
  {
   float x;
   float y;
   float z;
  };
};
union
{
  union
  {
 struct
    {
   std::uint8_t b;
   std::uint8_t g;
   std::uint8_t r;
  std::uint8_t a;
 };
 float rgb;
  };
std::uint32_t rgba;
};
  1. 其他类型| 点云类型 | 描述 || --- | --- || PointXYZRGB | float x, y, z; std::uint32_t rgba;与PointXYZRGBA相同 || PointXY | float x, y; 简单的二维x-y点结构 || InterestPoint | float x, y, z, strength;与PointXYZI类似,除了强度包含关键点强度的度量 || Normal | float normal[3], curvature;最常用之一,表示给定点处的曲面法向,以及曲率的度量 || PointNormal | float x, y, z; float normal[3], curvature;保存XYZ数据、曲面法线和曲率的点结构 || PointXYZRGBNormal | float x, y, z, normal[3], curvature; std::uint32_t rgba;保存XYZ数据、RGBA颜色以及曲面法线和曲率的点结构 || PointXYZINormal | float x, y, z, intensity, normal[3], curvature;保存XYZ数据和强度值以及曲面法线和曲率的点结构 || PFHSignature125 | float pfh[125];包含给定点的PFH(点特征直方图)的简单点类型 || FPFHSignature33 | float fpfh[33];包含给定点的FPFH(快速点特征直方图)的简单点类型 || PointSurfel | float x, y, z, normal[3], rgba, radius, confidence, curvature;包含XYZ数据、曲面法线、RGB信息、比例、置信度和曲面曲率的复杂点类型 |

更多点云类型参见:点云类型(https://blog.csdn.net/tobebest_lah/article/details/106241406)

3.3 点云储存格式

点云目前的主要存储格式包括:PCD、pts、LAS等。其中PCD 存储格式是 PCL 库官方指定格式,PCD 格式具有文件头,用于描绘点云的整体信息:定义数字的可读头、尺寸、点云的维数和数据类型;一种数据段,可以是 ASCII 码或二进制码。数据本体部分由点的笛卡尔坐标构成,文本模式下以空格做分隔符。

激光光束

其中WIDTH用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:

  1. 它能确定无序数据集的点云中点的个数(和下面的POINTS一样);
  2. 它能确定有序点云数据集的宽度(一行中点的数目)。

HEIGHT用点的数目表示点云数据集的高度。类似于WIDTH,HEIGHT也有两层解释:

  1. 它表示有序点云数据集的高度(行的总数);
  2. 对于无序数据集它被设置成1(被用来检查一个数据集是有序还是无序)。

无序点云是指通过3D扫描或其他方式获取的点云数据,其中点的顺序没有特定的结构或排列规则。每个点具有特定的位置信息,但不一定按照任何特定的顺序排列。无序点云的点之间没有明确的连接关系,可以看作是随机散布在空间中的点。有序点云是指点云数据按照特定的结构或排列规则进行有序排列的数据。例如,有序点云可以是通过三维传感器按照网格或栅格的方式获取的数据,其拓扑结构比较明确。有序点云的点之间具有一定的连接关系,常用于表示网格模型或体素数据。PCD 不是第一个支持3D点云数据的文件类型,尤其是计算机图形学和计算几何学领域,已经创建了很多格式来描述任意多边形和激光扫描仪获取的点云。常见的有下面几种格式:

  1. PLY 是一种多边形文件格式 , 由Stanford大学的Turk等人设计开发;
  2. STL 是3D Systems公司创建的模型文件格式,主要应用于CAD、CAM领域;
  3. OBJ 是从几何学上定义的文件格式,首先由Wavefront Technologies开发;
  4. X3D 是符合ISO标准的基于XML的文件格式,表示3D计算机图形数据;
  5. 其他。

以上所有格式都有其优缺点,因为他们是在不同时期为了满足不同的需求所创建的,那时很多当今流行的传感器和算法都还没有发明。其中一部分点云储存的格式可以在PCL中进行输入输出的转换。


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分