【激光雷达】认识点云库PCL

举报
一颗小树x 发表于 2020/11/30 22:33:09 2020/11/30
【摘要】 前言 激光雷达生成的点云数据通过可视化显示,是下图中的效果: 能看到激光雷达发射多线激光束(蓝色圆圈形纹),通过接收器进行处理加工,最好可视化展示出来。从图能看到车、行人、路灯杆、周围的建筑物等。   那么通过什么来处理这些点云数据呢? 答案是:PCL点云库 目录 简介 特征 PCL的代码库图 PCL项目由哪些开发的? 以下适合纯使用者,快...

前言

激光雷达生成的点云数据通过可视化显示,是下图中的效果:

能看到激光雷达发射多线激光束(蓝色圆圈形纹),通过接收器进行处理加工,最好可视化展示出来。从图能看到车、行人、路灯杆、周围的建筑物等。

 

那么通过什么来处理这些点云数据呢?

答案是:PCL点云库

目录

简介

特征

PCL的代码库图

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呢??

点击我来查找不同版本的API

用户论坛:http://www.pcl-users.org

 

以下适合开发者,快速入门

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具有写自己文件放置的位置路径

参考:https://blog.csdn.net/lizhengze1117/article/details/89154028?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13

 

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

 

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。