PCL点云之旅16 - 点云均匀降噪方法

610 阅读1分钟

实现效果

image.png

image.png

image.png

点云降噪的主要思路就是,你传入采样网格大小,然后采样网格中有很多点,你保留其中最接近中心点的点云,其他点云给他过滤掉。这样我们就可以实现点云均匀降噪的效果

实现步骤

  1. 首先导入pcl均匀降噪方法库#include <pcl/filters/uniform_sampling.h>
  2. 和体素滤波大体操作一样,所以我们就可以复用他的网格
  3. 将均匀降噪结果返回场景

代码实现

pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_filter_uniform_sample(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,float leaf_size)
{

    pcl::UniformSampling<pcl::PointXYZ> unifm_smp;
    unifm_smp.setRadiusSearch(leaf_size);
    unifm_smp.setInputCloud(cloud_in);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out (new pcl::PointCloud<pcl::PointXYZ> ()) ;
    unifm_smp.filter(*cloud_out);
    return cloud_out;
}


void MainWindow::filter_uniform_press(){
    dialog_voxel=new voxel_filter_dialog();
    connect(dialog_voxel,SIGNAL(sendData(QString)),this,SLOT(grid_filter_clicked(QString)));
    if(dialog_voxel->exec()==QDialog::Accepted){}
    delete dialog_voxel;
}


void MainWindow::filter_uniform_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_uniform_sample(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();
    }
}