实现效果
在我们获取点云的时候,总会由于设备精度的限制、操作人员的人为因素和环境条件因素等带来的影响,以及电磁波衍射特性和数据进行拼接配准操作过程的影响,点云数据总会产生一些我们意想不到的噪声点。在点云处理流程中滤波处理作为预处理的第一步,往往对后续处理的影响很大,因此只有在滤波预处理中将噪声点、离群点等等按照后续处理定制,才能更好的进行配准、特征提取、曲面重建和可视化等后续的处理。
前面介绍了怎么使用体素滤波,通过定义采样网格大小来过滤离群点。今天我们来学习通过采样网格大小来过滤近似点的操作。
实现思路
- 首先导入PCL的近似点处理类库。
#include <pcl/filters/approximate_voxel_grid.h> - 通过采用体素滤波网格的弹窗进行复用。
- 通过传入采样网格大小进行点云滤波
实现步骤
- 槽函数
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;
}