@[TOC]PCL中滤波模块的学习
学习背景
参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,,PCL版本为1.8.1,CMake版本为3.10.2
学习内容
使用统计分析技术,从一个点云数据中集中移除测量噪声点(也就是离群点)比如:激光扫描通常会产生密度不均匀的点云数据集,另外测量中的误差也会产生稀疏的离群点,使效果不好,估计局部点云特征(例如采样点处法向量或曲率变化率)的运算复杂,这会导致错误的数值,反过来就会导致点云配准等后期的处理失败。
源代码及所用函数
源代码
#include<iostream>//标准输入输出头文件
#include<pcl/io/pcd_io.h>//PCD输入输出头文件
#include<pcl/point_types.h>//点类型定义头文件
#include<pcl/filters/statistical_outlier_removal.h>
int main(int argc,char**argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
//定义读取对象
pcl::PCDReader reader;
//读取点云文件
reader.read<pcl::PointXYZ>("table_400.pcd",*cloud);
std::cout<<"滤波前的点云" << std::endl;
std::cout<<*cloud<<std::endl;
/* ----------------- 创建滤波器,对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1 ----------------- */
/* ------------ 这意味着如果一个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来 ------------ */
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;//创建滤波器对象
sor.setInputCloud(cloud);//设置待滤波的点云
sor.setMeanK(50);//设置进行统计时考虑查询点的邻近点数
sor.setStddevMulThresh(1.0);//设置判断是否为离群点的阈值
sor.filter(*cloud_filtered);//存储滤波后的点
std::cout<<"滤波后:"<<std::endl;
std::cout<<*cloud_filtered<<std::endl;
pcl::PCDWriter writer;
writer.write<pcl::PointXYZ>("table_scene_lms400_inliers.pcd",*cloud_filtered,false);
sor.setNegative(true);
sor.filter(*cloud_filtered);
writer.write<pcl::PointXYZ>("table_scene_lms400_outliers.pcd",*cloud_filtered,false);
return(0);
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)#指定CMake的最低版本要求为3.1
project(statistical_removal)#设置项目名称
#set(CMAKE_CXX_STANDARD 11)#设置C++编译器版本为C++11
find_package(PCL 1.8 REQUIRED)#查找PCL库,要求版本为1.7或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (statistical_removal statistical_removal.cpp)#需要修改
target_link_libraries (statistical_removal ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。
运行结果
滤波后点云
过滤掉的点
函数
sor.setMeanK(50)
;这行代码是在设置StatisticalOutlierRemoval类的mean_k参数的值为50。mean_k参数决定了计算每个查询点的邻居时使用的邻居点数量,通常情况下,mean_k的取值范围在1到50之间。取值越大,计算平均距离时考虑的邻居点就越多,对离群点的鲁棒性越强,但计算量也越大。取值越小,计算速度越快,但对离群点的鲁棒性就越差。