3D 数据基础知识
什么是点云?
- 点云 (Point Cloud) 是某个坐标系下的点的集合。点包含了丰富的信息,包括三维坐标 X,Y,Z、颜色、分类值、强度值、时间等等。点云在组成特点上分为两种,一种是有序点云,一种是无序点云
- 点云不是通过普通的相机拍摄得到的,一般是通过三维成像传感器获得,比如双目相机、三维扫描仪、RGB-D 相机、LiDAR 激光
- 有序点云:一般由深度图还原的点云,有序点云按照图方阵一行一行的,从左上角到右下角排列,当然其中有一些无效点因为。有序点云按顺序排列,可以很容易的找到它的相邻点信息。有序点云在某些处理的时候还是很便利的
- 无序点云:无序点云就是其中的点的集合,点排列之间没有任何顺序,点的顺序交换后没有任何影响。是比较普遍的点云形式,有序点云也可看做无序点云来处理
点云数据的特点?
- 无序性:点云数据是一个集合,对数据的顺序是不敏感的。这使得处理点云数据的模型需要对数据的不同排列保持不变性
- 点与点直接存在空间关系: 一个物体通常由特定空间内的一定数量的点云构成,也就是说这些点云之间存在空间关系。为了能有效利用这种空间关系
- 旋转平移不变性:同一个物体,在空间经过旋转或平移,还是原来那个物体
点云数据的表示方式?
- 将点云数据投影到二维平面(多视图法):不直接处理三维的点云数据,而是先将点云投影到某些特定视角再处理,如前视视角和俯视角,再使用 2D-CNN 进行分类或分割。比较典型的算法有 MV3D 和 AVOD
- 将点云数据划分到有空间依赖关系的 voxel(体素法): 先将点云映射到体素空间上,再通过 3D-CNN 进行分类或者分割。由于是三维的数据量,时间和空间复杂度都非常高,目前已经不是主流的方法了
- 直接在点云数据上应用深度学习模型(点云法):直接使用点云数据,比较经典的有 PointNet、PointNet++
- 基于图的方法:现实生活中存在大量的非结构化数据,如交通网络、社交网络等,这些数据的节点间存在联系,可以表示为图。研究图数据的学习是近年来学界的热点。三维点云数据可以看作图数据的一种
点云数据的存储格式?
- pts:最简便的点云格式,直接按 XYZ 顺序存储点云数据,可以是整型或者浮点型
- LAS :激光雷达数据(LiDAR)产生的数据,比 pts 复杂
- PCD :有文件头,用于描绘点云的整体信息:定义数字的可读头、尺寸、点云的维数和数据类型
- xyz :一种文本格式,前面 3 个数字表示点坐标,后面 3 个数字是点的法向量,数字间以空格分隔
点云数据的处理库?
- PCL: 支持跨平台存储,可以在 Windows、Linux、macOS、iOS、Android 上部署。可应用于计算资源有限或者内存有限的应用场景,是一个大型跨平台开源 C++ 编程库,它实现了大量点云相关的通用算法和高效数据结构,其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等操作,非常方便移动端开发
- VCG:―专门为处理三角网格而设计的,该库很大,且提供了许多先进的处理网格的功能,以及比较少的点云处理功能
- CGAL:―计算几何算法库,设计目标是以 C++ 库的形式,提供方便、高效、可靠的几何算法,其实现了很多处理点云以及处理网格的算法
- Open 3D―可以支持 3D 数据处理软件快速开发的开源库。支持快速开发处理 3D 数据的软件。Open3D 前端在 C++ 和 Python 中公开了一组精心选择的数据结构和算法。后端经过高度优化,并设置为并行化。Open3D 是从一开始就开发出来的,带有很少的、经过仔细考虑的依赖项。它可以在不同的平台上设置,并且可以从源代码进行最小的编译。代码干净,样式一致,并通过清晰的代码审查机制进行维护。在点云、网格、rgbd 数据上都有支持
点云数据的深度学习应用?
- 分类:对三维形状进行分类
- 分割:对每个点进行标记
- 目标检测:找出三维空间的特定形状
点云数据的点云配准 (Point Cloud Registration)?
- 点云配准指的是输入两幅点云 (source) 和 (target) ,输出一个变换 使得 和 的重合程度尽可能高。变换 可以是刚性的 (rigid),也可以不是,如果只考虑刚性变换,则变换只包括旋转、平移,如上图从红色点云变换到灰色点云的过程。其实类似 2D 上求出仿射变换矩阵
- 三维重建:生成完整的三维场景是各种计算机视觉应用的基础和重要技术,包括自动驾驶中的高精度三维地图重建、机器人技术中的三维环境重建和实时监控地下采矿的三维重建。例如,点云配准可以为机器人应用中的路线规划和决策构建三维环境
- 三维定位。在三维环境中定位移动智能设备的位置对于机器人技术尤为重要。例如,无人驾驶汽车估计其在地图上的位置(例如 < 10cm)及其到道路边界线的距离。点云配准可以将当前的实时三维点云精确匹配到所属的三维环境中,提供高精度的定位服务
- 姿态估计。将一个点云 A(3D 实时视图)与另一个点云 B(3D 环境)对齐,可以生成与点云 B 相对的点云 A 的姿态信息,这些姿态信息可用于机器人的决策
如何将 3D 点云数据投影到 2D 平面上?
- 目地是将 3D 点云数据投影到某个 “视角” 的 2D 平面上
- 1)定义平面:3 维平面的表示方法,其中 (A, B, C) 为平面法向量
- 2)定义垂直于平面的直线方程:假设(x0, y0, z0)为空间中的任意一点,它在平面上的投影坐标为(x, y, z),那么由这两个点组成的向量也是平面的法向量,则应与法向量(A, B, C)平行,从而可以得到
- 3)将点云数据代入方程,得到点云在 2D 平面的投影:将以上公式代回公式 1,解出 t,并将 t 代到公式 3 解出 (x, y, z)
什么是 RGBD 数据?
- RGBD:深度相机扫描得到的每一帧数据不仅包括了场景中的点的彩色 RGB 图像,还包括每个点到深度相机所在的垂直平面的距离值。这个距离值被称为深度值(depth),这些深度值共同组成了这一帧的深度图像
- 深度图像:可以看做是一副灰度图像,其中图像中每个点的灰度值代表了这个点的深度值,即该点在现实中的位置到相机所在垂直平面的真实距离
- RGBD 数据可以转为点云数据,执行点云的操作
如何将 RGBD 图转为点云 (pcd) 显示?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import open3d as o3d
import matplotlib.pyplot as plt
if __name__ == "__main__":
print("Read Redwood dataset")
color_raw = o3d.io.read_image("color.jpg")
depth_raw = o3d.io.read_image("depth.png")
rgbd_image = o3d.geometry.create_rgbd_image_from_color_and_depth(
color_raw, depth_raw)
print(rgbd_image)
plt.subplot(1, 2, 1)
plt.title('grayscale image')
plt.imshow(rgbd_image.color)
plt.subplot(1, 2, 2)
plt.title('depth image')
plt.imshow(rgbd_image.depth)
plt.show()
pcd = o3d.geometry.create_point_cloud_from_rgbd_image(
rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))
# Flip it, otherwise the pointcloud will be upside down
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
o3d.io.write_point_cloud("test.pcd", pcd)
处理 3D 数据时,为什么先进行 “基面校正”?
- 3D 相机有时候不是正射缺陷,导致其获取的深度信息是基于垂直 "实际平面" 的,此时如果遇到弯折的物体时,侧面的深度信息表现得比缺陷还深,直接使用深度学习,其效果更差
- 如果先拟合出一个标准的平面,然后原始平面减去标准平面,得到差分平面。这个平面上缺陷表现得更加明显
什么是 HHA 编码?
- 将深度图像转换为三种不同的通道 (水平差异,对地高度以及表面法向量的角度),并且会将 3 个通道数据线性重定标到
0-255
- 深度图的空间信息通常有两种表现形式:距离信息和 HHA 编码信息。距离信息是目标物体与采集设备表面距离的相关信息,可以反映物体在场景之内的空间位置关系,经常会以单通道图像的形式参与运算
- HHA 编码信息是距离信息的空间拓展表现形式,分别为该点的水平视差,水平高度以及重心角度,经常会以三通道图像的形式参与运算。距离信息表现形式较为简单,可以方便使用,相比之下,HHA 编码信息表现形式复杂,计算量大,消耗计算资源多,但是 HHA 编码信息表现形式可以让网络提取更丰富的深度特征信息
基于 RGBD 图像的多模态特征融合?
- 深度图的空间信息通常有两种表现形式:距离信息和 HHA 编码信息,为了融合亮度图和深度图,常常使用以下策略
- (1)前期融合:直接将两种图像融合,组合成四通道或六通道图像再输入网络,这种融合语义信息混在一起,效果不明显
- (2)后期融合:两种图像使用两个分支提取特征,在最后进行特征融合,相比较前期融合,效果更优
- (3)多级融合 - 编码阶段:在编码时的每个阶段进行特征融合,这种方式在多阶段互补利用,避免大量有用信息的丢失,但是融合方式过于简单,无法深层次的挖掘互补的 RGB 和深度特征
- (4)多级融合 - 解码阶段:在解码时的每个阶段进行特征融合
- (5)多级融合 - 第三分支融合:在原有 2 个分支基础上加一个融合分支,进行多层次融合,效果更佳
参考
- 【点云处理】基于深度学习模型的不同处理方式 - 云社区 - 华为云
- 2021 最新关于点云配准的全面综述 - 知乎
- python 三维点云投影(二)_python 画三维投影_Coding 的叶子的博客 - CSDN 博客
- Open3D——RGBD 图转化为点云 (pcd) 并显示_rgb-d 转换为 pcd_CV-deeplearning 的博客 - CSDN 博客
- 点云在任意平面上获取二维投影_点云投影到二维图像_Clichong 的博客 - CSDN 博客
- 基于 RGBD 的三维重建技术 - 知乎
- 三维传感器、3D 相机、激光线扫相机、3D 传感器视觉龙 视觉系统 检测 机器人引导 测量 深度学习检测 图像处理 智能检测 三维传感器 CCD 相机 贴合 读码
- RGB-D 图像的 HHA 编码 - CSDN 博客
- 基于 RGB-D 图像的多模态特征融合_rgb 与深度图融合 - CSDN 博客