PCL点云之旅15 - gridmin采样算法

334 阅读1分钟

实现效果

image.png

image.png

image.png

gridmin也是pcl自带的一个过滤库。他的作用非常的简单,就是先忽略Z轴,先根据X轴和Y轴生成采样网格【网格大小由用户输入参数决定】然后将Z轴上面的点投射到采样网格上面去【也就是X轴Y轴上面最小的那个Z轴点】

实现步骤

  1. 首先引入PCL的过滤库下面的gridmin算法对应的库:#include <pcl/filters/grid_minimum.h>
  2. 重复使用体素滤波时留下的弹窗,用户输入最小采样网格
  3. 采样网格和槽函数进行链接。
  4. 调用gridmin算法,过滤点云数据返回场景

代码实现

//gridmin
pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_filter_gridmin(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,float resolution)
{

    pcl::GridMinimum<pcl::PointXYZ> gm(resolution);
    gm.setInputCloud(cloud_in);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out (new pcl::PointCloud<pcl::PointXYZ> ()) ;
    gm.filter(*cloud_out);
    return cloud_out;
}


//gridmin采样网格实现
void MainWindow::grid_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_gridmin(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();
    }
}


// gridmin采样算法收到点击
void MainWindow::gridmin_filter_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;
}