【激光雷达】认识点云库PCL
前言
激光雷达生成的点云数据通过可视化显示,是下图中的效果:
能看到激光雷达发射多线激光束(蓝色圆圈形纹),通过接收器进行处理加工,最好可视化展示出来。从图能看到车、行人、路灯杆、周围的建筑物等。
那么通过什么来处理这些点云数据呢?
答案是:PCL点云库
目录
简介
PCL全称 Point Cloud Library,中文简称:点云库;这个库包含丰富的点云处理函数。点云库(PCL)是一个独立的,大规模的,开放的项目,用于2D / 3D图像和点云处理。
特征
- PCL是ROS(机器人操作系统)的3D处理主干。
- 点云库(PCL)可在许多操作系统上运行,并且预构建的二进制文件可用于Linux,Windows和Mac OSX。
- PCL是根据BSD许可条款发布的,可免费用于商业和研究用途。
- 为了简化开发,将PCL分为一系列较小的代码库,可以分别进行编译。
- PCL分为一系列模块化库,包含:filters、features、keypoints、registration、kdtree、segmentation、sample、consensus surface、recognition、visualization。
图中标注了常用的模块函数;
PCL库主要包括:点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化
PCL的代码库图
类似于Boost of C ++库。这是一个例子:
PCL项目由哪些开发的?
PCL开源项目,由来自许多不同组织的众多工程师和科学家开发的,分布在世界各地,包括:
以下适合纯使用者,快速入门
(如果开发者可以跳过,后面介绍)
API文档:http://docs.pointclouds.org/trunk/
如何找到不同版本的API呢??
以下适合开发者,快速入门
PCL开发者论坛:http://www.pcl-developers.org
PCL开源库地址:https://github.com/PointCloudLibrary/pcl
如果开发过程中遇到问题,可以在下面提问交流:
开发者教程:http://www.pointclouds.org/documentation/tutorials/
其他
PCL点云库的标志
PCL官方博客文章:http://www.pointclouds.org/blog/
安装PCL
Ubuntu系统
sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-all
Linux系统
wget https://aur.archlinux.org/packages/pc/pcl/pcl.tar.gz
tar -xzf pcl.tar.gz
cd pcl
makepkg
sudo pacman -U pcl*.xz
安装好后,需要进行配置。参考官网:在自己的项目中使用PCL
开发实践
1)PCL点云读取和显示
dmeo1 基本的读取与显示
PCL中点云的显示主要有两个类:1. pcl::visualization::CloudViewer; 2. pcl::visualization::PCLVisualizer。
下面代码采用CloudViewer,读取点云数据的pcd文件:
#include <iostream> //标准输入输出流
#include <pcl/io/pcd_io.h> //PCL的PCD格式文件的输入输出头文件
#include <pcl/point_types.h> //PCL对各种格式的点的支持头文件
#include <pcl/visualization/cloud_viewer.h> //引入cloud_viewer相关文件
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 创建点云(指针)
//读入PCD格式的文件,如果文件不存在,返回-1
if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:/PCL_TEST/velodyn_1.pcd", *cloud) == -1)
{
PCL_ERROR("Couldn't read file test_pcd.pcd \n"); //文件不存在时,返回错误,终止程序。
return (-1);
}
std::cout << "Loaded "
<< cloud->width * cloud->height
<< " data points from test_file.pcd with the following fields: "
<< std::endl;
for (size_t i = 0; i < cloud->points.size (); ++i) //通过for循环,显示所有的点 效率偏慢
std::cout << " " << cloud->points[i].x
<< " " << cloud->points[i].y
<< " " << cloud->points[i].z << std::endl;
pcl::visualization::CloudViewer viewer("pcd viewer"); //建立CloudViewer 对象
viewer.showCloud(cloud); //窗口可视化显示
system("pause");
return (0);
}
pcl 是一个命名空间,跟std类似;PointCloud是类模板,<pcl::PointXYZ>是模板类实例化的类型。
其中PointXYZ可以替换为PointXYZRGB,、PointXYZRGBA等多种点云的格式。
D:/PCL_TEST/velodyn_1.pcd具有写自己文件放置的位置路径
demo2 基本读取与丰富地显示
pcl::visualization::PCLVisualizer
如果想要更加丰富的点云显示,如给点云添加颜色、显示点云中的法矢、在窗口中自己画图案、自定义视角的位置,可以采用pcl::visualization::PCLVisualizer
官网案例参考:http://www.pointclouds.org/documentation/tutorials/pcl_visualizer.php#pcl-visualizer
下面代码采用PCLVisualizer,读取点云数据的pcd文件:
#include <opencv2/core/core.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp> //前面是导入OpenCV的函数文件
#include <pcl/visualization/cloud_viewer.h> //导入点云可视化的文件
using namespace pcl; //申明命名空间
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer")); //创建PCLVisualizer对象
int main()
{
//定义点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
// 定义读取对象
pcl::PCDReader reader;
// 读取点云文件
reader.read<pcl::PointXYZ> ("D:/PCL_TEST/velodyn_1.pcd", *cloud); // D:/PCL_TEST/velodyn_1.pcd具有写自己文件放置的位置路径
while(true)
{
viewer1->removeAllPointClouds(); // 移除当前所有点云
viewer1->addPointCloud(cloud, "test");
viewer1->updatePointCloud(cloud, "test");
viewer1->spinOnce(0.0000000000001);
}
}
同样其中PointXYZ可以替换为PointXYZRGB,、PointXYZRGBA等多种点云的格式。
D:/PCL_TEST/velodyn_1.pcd具有写自己文件放置的位置路径
2)点云库对滤波算法的实现
其原理及算法:直通滤波器、体素滤波器、统计滤波器、半径滤波器 参考:https://www.cnblogs.com/ironstark/p/4991232.html
参考:https://blog.csdn.net/qq_30815237/article/details/86294496
VexelGrid滤波器对点云下采样;参考:https://blog.csdn.net/LimitOut/article/details/102888615
希望对你有帮助。( •̀ ω •́ )y
- 点赞
- 收藏
- 关注作者
评论(0)