简介
激光雷达扫描周围环境时候通常会产生不同点密度的数据集。同时,如果测量偏差(例如抖动、传感器安装位置偏差)将会导致更加稀疏的异常值出现,从而使点云生成结果质量更差。这样将会导致局部点云特征(如曲面法线或曲率变化)的估计更加复杂,很肯能导致估计出错误值。StatisticalOutlierRemoval算法通过对每个点的邻域进行统计分析,删除不符合特定标准的点,能够解决一些异常离群点的干扰。该算法对点云的异常值判断是通过输入点云的所有点到其邻域内距离分布的统计计算。对于每个点,都计算其到所有邻域距离的平均值。
下面是官网给出的统计离群点去除效果图:
StatisticalOutlierRemoval算法迭代整个点云两次过程,第一次迭代时候它首先计算每个点与最近 k k k个邻域的平均距离。这里 k k k的值可以通过 s e t M e a n K ( ) setMeanK() setMeanK()进行参数设置。其次,计算出所有这些点距离的均值与标准差,以来确定距离阈值。距离阈值的计算将等于: s t d d e v M u l t ∗ s t d d e v stddevMult * stddev stddevMult∗stddev。这里面的标准差系数 s t d d e v M u l t stddevMult stddevMult 可以使用函数 s e t S t d e v M u l t h r e s h ( ) setStdevMulthresh() setStdevMulthresh()进行设置。第二次迭代的过程中,如果点的平均邻域距离高于此阈值,则被判断为离群点。否则,为内联点。
代码Demo
#include <iostream>
#include <pcl/io/pcd_io.h>
#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>);
// Fill in the cloud data
pcl::PCDReader reader;
// Replace the path below with the path where you saved your file
reader.read<pcl::PointXYZ> ("table_scene_lms400.pcd", *cloud);
std::cerr << "Cloud before filtering: " << cloud->points.size()<< std::endl;
// Create the filtering object
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);
std::cerr << "Cloud after filtering: " << cloud_filtered->points.size() << 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;
}
实验结果
参考
https://pointclouds.org/documentation/classpcl_1_1_statistical_outlier_removal.html#details
R. B. Rusu, Z. C. Marton, N. Blodow, M. Dolha, and M. Beetz. Towards 3D Point Cloud Based Object Maps for Household Environments Robotics and Autonomous Systems Journal (Special Issue on Semantic Knowledge), 2008.