背景知识:
激光扫描通常会产生密度不均匀的点云数据集。另外,测量中的误差会产生稀疏的离群点,使效果更糟。
以下方法可以解决的其中部分问题:
对每个点的临域进行一个统计分析,并修剪掉那些不符合一定标准的点。稀疏离群点移除方法基于在输入数据中对点到临近点的距离分布的计算。对每个点,我们计算它到它的所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状由均值和标准差决定,平均距离在标准范围(由全局距离平均值和方差定义)之外的点,可被定义为离群点并从数据集中去除掉。
#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);//对每个点分析的临近点个数设为50
sor.setStddevMulThresh(1.0);标准差倍数设为1
sor.filter(*cloud_filtered);
viewer.showCloud(cloud_filtered);
while(!viewer.wasStopped())
{
}
return 0;
}