本文主要是介绍使用StatisticalOutlierRemoval滤波器移除离群点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景知识:
激光扫描通常会产生密度不均匀的点云数据集。另外,测量中的误差会产生稀疏的离群点,使效果更糟。
以下方法可以解决的其中部分问题:
对每个点的临域进行一个统计分析,并修剪掉那些不符合一定标准的点。稀疏离群点移除方法基于在输入数据中对点到临近点的距离分布的计算。对每个点,我们计算它到它的所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状由均值和标准差决定,平均距离在标准范围(由全局距离平均值和方差定义)之外的点,可被定义为离群点并从数据集中去除掉。
#include<iostream>
#include<pcl\point_cloud.h>
#include<pcl\point_types.h>
#include<pcl\io\io.h>
#include<pcl\io\pcd_io.h>
#include<pcl\filters\statistical_outlier_removal.h>
#include<pcl\visualization\cloud_viewer.h>
using namespace std;
int main()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);pcl::visualization::CloudViewer viewer("cloud_filered");if(pcl::io::loadPCDFile("G:\\PCD_data\\rabbit.pcd",*cloud)!=-1)return 0;pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;sor.setInputCloud(cloud);//设置输入点云sor.setMeanK(50);//对每个点分析的临近点个数设为50sor.setStddevMulThresh(1.0);标准差倍数设为1sor.filter(*cloud_filtered);viewer.showCloud(cloud_filtered);while(!viewer.wasStopped()){}return 0;
}
这篇关于使用StatisticalOutlierRemoval滤波器移除离群点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!