简介
![](https://i-blog.csdnimg.cn/blog_migrate/b45a4b8823ba7349f3720ad9bc03fcc7.png)
上面图片来自官方示例,简短说明一下半径离群点剔除的策略:就是在某个点半径范围内搜索邻域的点集个数能否满足设置点个数,不满足就是离群点。从上图可以看见,如果指定邻域至少包含1个点,那么黄色点将会被删除。如果指定邻域至少包含2个点,则黄色和绿色点都会被删除。一般情况下,RadiusOutlier会在条件滤波之后【pcl入门教程滤波系列】之ConditionFilter滤波,进行离群点去除。
Demo示例
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/radius_outlier_removal.h>
int main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZI>);
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZI>);
// Fill in the cloud data
pcl::PCDReader reader;
reader.read("16line.pcd", *cloud);
pcl::RadiusOutlierRemoval<pcl::PointXYZI> outrem;
// build the filter
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.8);
outrem.setMinNeighborsInRadius (5);
outrem.setKeepOrganized(false);
// apply filter
outrem.filter (*cloud_filtered);
std::cerr << "Cloud before filtering: " << cloud->points.size() << std::endl;
std::cerr << "Cloud after filtering: " << cloud_filtered->points.size()<< std::endl;
// save filterd data
pcl::PCDWriter writer;
writer.write("16line_filtered.pcd", *cloud_filtered, false);
return (0);
}
主要函数
RadiusOutlier主要设置两个参数,第一个是搜索点云的邻域半径:setRadiusSearch()
,另一个就是邻域半径内点云个数的下限:setMinNeighborsInRadius()
。
实验结果
![](https://i-blog.csdnimg.cn/blog_migrate/73cbeb7eab15187dc12bccc4d3bd2c28.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a9147a5e8ca1ddb5100d071885ceb35c.png)
这里有个奇怪现象,如果你的setKeepOrganized()函数设置为true的话,你会发现点云输入输出个数没有变化。主要原因是这个函数把所有的离群点坐标值都设置成为nan,并没有改变点云的空间位次。如果你想看到滤波后的点云个数,只需要将其设置成为false即可。
参考
https://pcl.readthedocs.io/projects/tutorials/en/latest/remove_outliers.html#remove-outliers