实现效果
gridmin也是pcl自带的一个过滤库。他的作用非常的简单,就是先忽略Z轴,先根据X轴和Y轴生成采样网格【网格大小由用户输入参数决定】然后将Z轴上面的点投射到采样网格上面去【也就是X轴Y轴上面最小的那个Z轴点】
实现步骤
- 首先引入PCL的过滤库下面的gridmin算法对应的库:
#include <pcl/filters/grid_minimum.h> - 重复使用体素滤波时留下的弹窗,用户输入最小采样网格
- 采样网格和槽函数进行链接。
- 调用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;
}