写在前面:小白学习激光雷达、PCL点云库,不懂Linux不懂c++,非常艰难的学着,做出学习笔记,希望能对小白起步有所帮助,也希望能够得到大佬的指点。
————————————————————
使用PCL(Point Cloud Library)库来实现激光雷达数据的滤波,就是应用PCL提供的算法和处理工具来对点云数据进行预处理,以去除噪声、异常值,优化数据质量,从而为后续的点云处理和分析任务提供更准确的数据基础。
首先给个完整例程:
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
int
main ()
{
// 创建一个PointCloud<pcl::PointXYZ>指针用于存储原始点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
// 创建一个PointCloud<pcl::PointXYZ>指针用于存储过滤后的点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
// 填充点云数据
cloud->width = 5; // 设置点云宽度为5
cloud->height = 1; // 设置点云高度为1,表示这是一朵无序点云
cloud->points.resize (cloud->width * cloud->height); // 根据宽度和高度分配点云空间
// 随机生成点云数据
for (auto& point: *cloud)
{
point.x = 1024 * rand () / (RAND_MAX + 1.0f); // 随机生成x坐标
point.y = 1024 * rand () / (RAND_MAX + 1.0f); // 随机生成y坐标
point.z = 1024 * rand () / (RAND_MAX + 1.0f); // 随机生成z坐标
}
// 打印原始点云数据
std::cerr << "Cloud before filtering: " << std::endl;
for (const auto& point: *cloud)
std::cerr << " " << point.x << " "
<< point.y << " "
<< point.z << std::endl;
// 创建一个PassThrough滤波器对象
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud (cloud); // 设置输入点云
pass.setFilterFieldName ("z"); // 设置滤波字段为z坐标
pass.setFilterLimits (0.0, 1.0); // 设置滤波范围为0到1
// pass.setNegative (true); // 如果设置为true,则滤波器将保留不在指定范围内的点
pass.filter (*cloud_filtered); // 执行滤波操作,结果存储在cloud_filtered中
// 打印过滤后的点云数据
std::cerr << "Cloud after filtering: " << std::endl;
for (const auto& point: *cloud_filtered)
std::cerr << " " << point.x << " "
<< point.y << " "
<< point.z << std::endl;
return (0);
}
这里的关键参数就是“setFilterFieldName("z")”,和setFilterLimits(0,1),对z轴范围在(0,1)以外的点全部过滤掉。
如果对x进行滤波,同样的参数下:
在学习完直通滤波后,提出几个问题:
1、如何将激光雷达扫描出的点云pcd文件进行滤波
2、这种滤波太死板,有没有更好的滤波方式