概述
点云Point Cloud是三维空间中,表达目标空间分布和目标表面特性的点的集合,点云通常可以从深度相机中直接获取,也可以从CAD等软件中生成。点云是用于表示多维点集合的数据结构,通常用于表示三维数据。在3D点云中,这些点通常代表采样表面的X,Y和Z几何坐标。当存在颜色信息时,点云变为4D。
三维图像有以下几种表现形式:深度图(描述物体与相机的距离信息),几何模型(由CAD等软件生成),点云模型(逆向工程设备采集生成)。
PCL(Point Cloud Library)是用于2D / 3D图像和点云处理的大型开源跨平台的C++编程库。 PCL框架实现了大量点云相关的通用算法和高效的数据结构。内容涉及了点云的获取、滤波、分割、配准、检索、特征提取、特征估计,表面重建、识别、模型拟合、追踪、曲面重建、可视化等等,这些算法可用于从嘈杂的数据中过滤出异常值,将3D点云缝合在一起,分割场景的部分区域,提取关键点并计算描述符,根据物体的几何外观识别实际物体,创建表面点云并将其可视化。支持多种操作系统,可以在Windows、Linux、MacOS X、Android、部分嵌入式实时系统上运行。
如果说OpenCV是2D信息获取与处理的集大成者,那么PCL就在3D信息获取与处理上也具有相同的地位。相比图像数据,点云数据多了一个维度,因此能够更全面的刻画三维场景中的对象。随着智能机器人,包括机械臂,无人汽车,无人机,服务机器人等快速普及和应用,点云处理及其背后的3D视觉,正在成为一个越来越重要且越来越活跃的领域。此外,PCL是BSD授权方式,可以进行完全免费的商业和学术应用。
应用领域
- 机器人领域
-
- 深度信息结合2D信息的应用研究。,深度信息的引人能够使机器人更好地时环境进行认知、辨识,与图像信息在机器人领域的应用一样, 需要强大智能算法支撑,PCL就为此而生。
- CAD /CAM 、逆向工程
-
- 目前在CAD/CAM 领域利用激光点云进行商精度测量与重建成为趋势
- 逆向工程技术能够对产品实物进行测绘,重构产品表面三维几何模型, 生成产品制造所需的数字化文档
- 激光遥感测量
-
- 激光遥感测量系统是目前最先进的实时获取地形表面三维空间信息和影像的遥感系统,但现在算法结果和实际结果差别较大,PCL中的模块有助于解决此问题。
- 虚拟现实、人机交互
-
- PCL是基于RGBD设备的虚拟现实和人机交互应用生态链中最重要的一个环节。
PCL的起源与发展
PCL 起初是 ROS(Robot Operating System )下由来自斯坦福大学的年轻博士Radu等人维护和开发的开源项目。主要应用于机器人研究应用领域,随着各个算法模块的积累,于 2011 年独立出来,正式与全球 3D信息获取处理的同行一起,组建了强大的开发维护团队,以多所知名大学、研究所和相关硬件、软件公司为主。截止目前 , 发展非常迅速,不断有新的研究机构等加入,在 Willow Garage,Nvidia, Google, Toyota, Trimble, Urban Robotics, Honda Research Institute 等多个全球知名公司的资金支持下,不断提出新的开发计划,代码更新非常活跃 , 至今(2023年9月)从 1.0 版本已经发布到 1.13.1 版本。
数据结构
根据激光测量原理得到的点云,包含三维坐标信息(xyz)和激光反射强度信息(intensity),激光反射强度与仪器的激光发射能量、波长,目标的表面材质、粗糙程度、入射角相关。根据摄影测量原理得到的点云,包括三维坐标(xyz)和颜色信息(rgb)。结合两个原理的多传感器融合技术(多见于手持式三维扫描仪),能够同时得到这三种信息。
基本类型PointCloud
PCL的基本数据类型是PointCloud
,一个PointCloud
是一个C++的模板类,它包含了以下字段:
width(int)
:指定点云数据集的宽度- 对于无组织格式的数据集,width代表了所有点的总数
- 对于有组织格式的数据集,width代表了一行中的总点数
height(int)
:制定点云数据集的高度- 对于无组织格式的数据集,值为1
- 对于有组织格式的数据集,表示总行数
points(std::vector<PointT>)
:包含所有PointT类型的点的数据列表
衍生类型
- PointXYZ - float x, y, z
- PointXYZI - float x, y, z, intensity(复数)
- PointXYZRGB - float x, y, z, rgb
- PointXYZRGBA - float x, y, z, uint32_t rgba
- Normal - float normal[3], curvature 法线方向,对应的曲率的测量值
- PointNormal - float x, y, z, normal[3], curvature 采样点,法线和曲率
- Histogram - float histogram[N] 用于存储一般用途的n维直方图
可视化Visualization
科学计算可视化(Visualization in Scientific Computing)能够把科学数据(包括测量获得的数值、图像或者计算中设计、产生的数字信息)变为直观的、可以用以图形图像信息表示的、随时间和空间变化的物理现象或物理量。进而呈现在研究者面前,使他们可以方便的观察、模拟和计算。
示例:
CloudViewer *
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
int user_data;
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer) {
// 设置背景色为粉红色
viewer.setBackgroundColor(1.0, 0.5, 1.0);
// 添加一个圆心为o,半径为0.1m的球体
pcl::PointXYZ o;
o.x = 0.2;
o.y = 0;
o.z = 0;
viewer.addSphere(o, 0.1, "sphere", 0);
std::cout << "i only run once" << std::endl;
}
void viewerPsycho(pcl::visualization::PCLVisualizer& viewer) {
static unsigned count = 0;
std::stringstream ss;
ss << "Once per viewer loop: " << count++;
// 每次刷新时,移除text,添加新的text
viewer.removeShape("text", 0);
viewer.addText(ss.str(), 200, 300, "text", 0);
//FIXME: possible race condition here:
user_data++;
}
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("G:/vsdata/PCLlearn/PCDdata/bun0.pcd", *cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
//这里会一直阻塞直到点云被渲染
viewer.showCloud(cloud);
// 只会调用一次 (非必须)
viewer.runOnVisualizationThreadOnce(viewerOneOff);
// 每次可视化迭代都会调用一次(频繁调用) (非必须)
viewer.runOnVisualizationThread(viewerPsycho);
while (!viewer.wasStopped()) {
user_data++;
}
return 0;
}