Ubuntu 18.04.06 PCL C++学习记录(十一)

@[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之间。取值越大,计算平均距离时考虑的邻居点就越多,对离群点的鲁棒性越强,但计算量也越大。取值越小,计算速度越快,但对离群点的鲁棒性就越差。

补充内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值