PCL点云之旅17 - 点云统计滤波

582 阅读1分钟

实现效果

image.png

image.png

image.png

统计滤波是PCL提供的一种去除离群点的方案,我们通过这个方案可以将一些设备意外扫描出现的误触情况给他删除出去。使得我们的点云模型更加的精准,能够更好的方便后续步骤处理。他的实现原理就是,某个区域的点密度,少于我们传入的参数,那么他就将这个区域的点都给他清除掉。

实现步骤

  1. 首先导入库函数:#include <pcl/filters/statistical_outlier_removal.h>
  2. 其他步骤和前面3篇文章一致,请发散思维

代码实现

pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_filter_sor(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,int num)
{
    //统计滤波
    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> outrem;//创建统计滤波对象
    //参数设置
    outrem.setInputCloud(cloud_in);
    outrem.setMeanK(num);//附近邻近点数
    outrem.setStddevMulThresh(1);//标准差系数
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>);
    outrem.filter(*cloud_out);
    return cloud_out;
}


void MainWindow::sor_filter_press(){
    dialog_filter_sor=new filter_sor_dialog();
    connect(dialog_filter_sor,SIGNAL(sendData(QString)),this,SLOT(sor_filter_clicked(QString)));
    if(dialog_filter_sor->exec()==QDialog::Accepted){}
    delete dialog_filter_sor;
}
void MainWindow::sor_filter_clicked(QString data){
    if(cloud.empty()){
        QMessageBox::warning(this,"warning","无点云输入");
        return;
    }else{
        std::cout<<"滤波大小为:"+data.toStdString()<<std::endl;
        if(data.isEmpty()){
            QMessageBox::warning(this,"warning","参数格式错误");
            return ;
        }
        float size=data.toFloat();
        auto cloud_out=pcl_filter_sor(cloud.makeShared(),size);
        cloud = *cloud_out;
        int size1 = static_cast<int>(cloud.size());
        QString PointSize = QString("%1").arg(size1);
        viewer->removeAllPointClouds();
        viewer->removeAllShapes();
        viewer->addPointCloud(cloud.makeShared() ,cloud_name[0]);
        viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, point_size, cloud_name[0]);
        viewer->resetCamera();
        ui->qvtkWidget->update();
    }
}