PCL点云之旅09 - 点云近似点滤波

160 阅读1分钟

实现效果

image.png

image.png

image.png

在我们获取点云的时候,总会由于设备精度的限制、操作人员的人为因素和环境条件因素等带来的影响,以及电磁波衍射特性和数据进行拼接配准操作过程的影响,点云数据总会产生一些我们意想不到的噪声点。在点云处理流程中滤波处理作为预处理的第一步,往往对后续处理的影响很大,因此只有在滤波预处理中将噪声点、离群点等等按照后续处理定制,才能更好的进行配准、特征提取、曲面重建和可视化等后续的处理。

前面介绍了怎么使用体素滤波,通过定义采样网格大小来过滤离群点。今天我们来学习通过采样网格大小来过滤近似点的操作。

实现思路

  1. 首先导入PCL的近似点处理类库。#include <pcl/filters/approximate_voxel_grid.h>
  2. 通过采用体素滤波网格的弹窗进行复用。
  3. 通过传入采样网格大小进行点云滤波

实现步骤

image.png

  • 槽函数
void MainWindow::approximateVoxelGrid_filter_press(){
    dialog_voxel=new voxel_filter_dialog();
    connect(dialog_voxel,SIGNAL(sendData(QString)),this,SLOT(approximateVoxel_clicked(QString)));
    if(dialog_voxel->exec()==QDialog::Accepted){}
    delete dialog_voxel;
}
  • 调用PCL库方法
void MainWindow::approximateVoxel_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_avoxel(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();
    }
}
pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_filter_avoxel(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,float leaf_size)
{
    pcl::ApproximateVoxelGrid<pcl::PointXYZ> avox;

    avox.setLeafSize(leaf_size,leaf_size,leaf_size);
    avox.setInputCloud(cloud_in);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>);
    avox.filter(*cloud_out);

    return cloud_out;
}