点云处理
第一章 点云数据采集
第二章 点云滤波
第三章 点云降采样
第四章 点云关键点检测
第五章 点云特征提取
第六章 点云分割
第七章 点云配准
1. 深度图像与点云
1.1 深度图像
目的
通过捕获场景的三维信息来增强二维图像的内容,为物体识别、导航、3D重建和其他应用提供空间信息。
定义
深度图像是一个二维图像,其中每个像素的值表示物体表面与相机或传感器之间的距离。
特性
表示物体与相机的实际距离。
通常以灰度图像形式呈现,其中较暗的像素表示近距离,较亮的像素表示远距离。
可以通过多种方式获得,包括结构光、双目立体相机和ToF传感器。
应用
计算机视觉,例如物体检测和识别。
机器人导航和避障。
虚拟和增强现实应用中的场景重建。
相关
首先通过深度相机采集深度图像(RGBD或仅Depth),然后将深度图像转换为点云,最后分别进行点云处理得到结果。
1.2 点云
目的
精确地表示和捕获三维空间中的物体和场景。
定义
点云是一个三维数据结构,其中每个点都有X、Y和Z坐标,表示物体表面上的点在空间中的位置。
特性
点云中的点可能还包括其他信息,如颜色、强度或法线。
它不像传统的三维模型那样有连续的表面,而是由离散的点组成。
应用
三维扫描和建模。
地理信息系统中的地形测量。
自动驾驶汽车的环境感知。
相关
首先通过深度相机采集深度图像后转换为点云(格式多为pcd或ply),或激光雷达获取的点云(格式为las),最后进行点云处理得到结果。
2. 采集设备
深度图像可以通过深度相机获取,点云数据可以通过深度图像转换或激光雷达获取。
2.1 深度相机
目的
为了捕捉场景的三维信息,并为应用如增强现实、物体检测、手势识别等提供深度数据。
定义
深度相机是一种可以捕捉三维信息的数字相机。它通常使用红外、结构光或时差法来测量物体距离相机的深度。
深度相机可分为三类:红外结构光传感器,ToF传感器,双目立体相机
2.1.1 红外结构光传感器
目的
快速而精确地获取物体的深度和形状信息。
定义
红外结构光传感器利用红外光源发射预设的结构光模式(如点阵或其他模式)至目标上,然后通过检测反射回来的结构光模式的变形来测量物体的深度信息。
特性
短距离精确:特别适用于近距离的深度测量。
空间分辨率较高:能捕捉详细的深度信息。
可能受到环境光的影响。
应用
人脸识别
手势控制
三维建模和扫描
相关
结构光相机由激光光源、ROD、透镜、反射镜、DMD驱动板、吸光组件和投影镜头组成。
简单的结构光包括括点结构光,线结构光以及简单的面结构光等。复杂的结构光如光学图案的条纹、编码和散斑。
2.1.2 时间飞行 (ToF) 传感器
目的
在更大的距离上快速地获取深度信息。
定义
ToF传感器通过发送光脉冲并测量光脉冲从发射到反射回来所需的时间来测量物体的距离。通过这种方式,它可以直接得到场景中每一个像素的深度信息。
特性
大范围测量:可在更长的距离上进行深度测量。
实时性好:能够实时提供深度信息。
对环境光干扰较小。
应用
虚拟现实和增强现实
室内导航
机器人避障
人群计数和跟踪
相关
Tof相机由照射单元、光学透镜、成像传感器、控制单元、计算单元组成。
Tof光源分为脉冲调制(dTof)和连续波调制(iTof)。
2.1.3 双目立体相机
目的
模仿人类的双眼视觉,捕获三维深度信息。
定义
双目立体相机包含两个分开的摄像头,模拟人眼的双眼视觉,通过计算两个摄像头视图之间的差异(RGB图像特征匹配,三角测量间接计算)来测量深度。
特性
基于视差:深度是通过计算两个摄像头之间的视差来得到的。
无需外部光源:不依赖红外或其他外部光源。
对外部环境因素如光线、颜色等可能更敏感。
应用
三维建模
虚拟现实和增强现实
自动驾驶和避障
视频拍摄与增强
相关
双目相机主要受算法影响精度,有IR的话效果会好很多。
2.2 激光雷达 (LiDAR)
目的
获取高精度、高分辨率的三维数据,用于地形测绘、无人驾驶车辆导航等。
定义
激光雷达(LiDAR,Light Detection And Ranging)是一种远程感测技术,使用激光光束来测量物体与传感器之间的距离。
特性
高精度:可以捕捉高度详细的三维信息。
长距离测量:能够在远距离上测量物体。
不依赖于环境光:可以在夜间或恶劣天气条件下工作。
数据密度高:能生成大量数据点。
应用
地形和植被测绘
无人驾驶车辆的导航和避障
城市规划
森林资源管理
电力线和管道检查
相关
激光雷达由激光发射器、接收器和惯性定位导航组成。
激光雷达根据扫描方式可分为机械式、半固态和固态(Flash面阵和相控阵)激光雷达。
注意
采集点云数据是在设备厂商提供的SDK上完成的。
影响选型的重要指标,分辨率、测量范围、精度、FPS、FOV、受干扰、图像类型等。
3.实现
open3d:
import open3d as o3d
import numpy as np
pcd=o3d.io.read_point_cloud("xxx.pcd",format='pcd')
#将点云的坐标和颜色转换为numpy格式
points=np.array(pcd.points)
colors=np.array(pcd.colors)
#可视化
o3d.visualization.draw([pcd])
pcl
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
int main(int argc, char** argv) {
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ> ("xxx.pcd", *cloud) == -1){
PCL_ERROR("couldn't read file");
return 0;
}
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
}
return 0;
}