点云去噪是点云预处理的重要步骤,本blog将给出点云去噪的一份示例代码
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/console/parse.h>
#include <pcl/filters/statistical_outlier_removal.h>
using namespace std;
// -----Main-----
int main(int argc, char** argv)
{
// 解析命令行参数
if (argc != 3)
{
cout <<"Usage : ./xxx x.pcd y.pcd"<<endl;
return 0;
}
//声明用于存load进来的点云,以及filter之后的点云.
pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile (argv[1], *point_cloud_ptr);
//对点云做一些云除噪音的操作.
// 声明一个滤波器.
pcl::StatisticalOutlierRemoval<pcl::PointXYZRGB> sor;
sor.setInputCloud(point_cloud_ptr);
sor.setMeanK(50);
sor.setStddevMulThresh (1.0);
sor.filter (*cloud_filtered);
//保存filter之后的点云并比较filter前后点的数量变化.
pcl::io::savePCDFileASCII (argv[2], *cloud_filtered);
cout << "before filter :" << point_cloud_ptr->points.size() << endl;
cout << "After filter :" << cloud_filtered->points.size() << endl;
}
对于sor那几行代码作解释如下
- 创建统计分析滤波器,然后设置滤波器输入(注意传入的是Ptr),也就是我们待处理的点云的指针
- 设置对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1, 这意味着如果一个点的距离超出了平均距离加上一个标准差以上,则该点被标记为离群点,并将它移除。
- 最后统计分析滤波后,输出的结果就是cloud_filtered。
下面是一个filter 点云前后的变化示意图.
-
filter之前
-
filter之后
且点的数据上也发生了明显的变化
before filter :161599
After filter :156728