【PCL】VoxelGrid体素化网格滤波器

2021-06-01  本文已影响0人  ClarkWang1214

体素滤波

体素化网格方法实现下采样,即减少点的数量,减少点云数据并同时保持点云的形状特征,在提高配准、曲面重建、形状识别等算法速度中非常实用。

PCL实现的体素滤波VoxelGrid类通过输入的点云数据创建一个三维体素栅格(可以将体素栅格想象为微小的空间三维立方体的集合),然后在每个体素内,用体素中的所有点的重心近似显示体素中的其他点,这样该体素内所有点就用一个重心点最终表示,对于所有体素处理后得到过滤后的点云。这种方法比用体素中心来逼近的方法更慢,但对于采样点对应曲面的表示更为准确。

代码实现

#include <iostream> 
#include <pcl/io/pcd_io.h> //文件输入输出
#include <pcl/point_types.h> //点类型相关定义
#include <pcl/visualization/cloud_viewer.h>  //点云可视化相关定义
#include <pcl/filters/voxel_grid.h> //体素滤波相关

int main (){
    //1.读取点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("../table_scene_lms400.pcd", *cloud) == -1){
        PCL_ERROR("Cloudn't read file!");
        return -1;
    }
    cout << "there are " << cloud->points.size() << " points before filtering." << endl;
        
    //2.体素栅格滤波
    // 创建一个大小为1cm的pcl::VoxelGrid滤波器,输入数据作为滤波器的输入,滤波计算后的输出储存到cloud_filtered中
    //pcl::VoxelGrid<sensor_msgs::PointCloud2> sor;//创建滤波对象
    pcl::VoxelGrid<pcl::PointXYZ> sor;
    sor.setInputCloud(cloud);//给滤波对象设置需过滤的点云
    sor.setLeafSize(0.01f, 0.01f, 0.01f);//设置滤波时创建的体素大小为1cm*1cm*1cm的立方体
    sor.filter(*cloud_filtered);//执行滤波处理,存储输出为cloud_filtered
    
    //3.将滤波后点云数据保存到本地
    pcl::io::savePCDFile<pcl::PointXYZ>("../table_scene_lms400_filter.pcd", *cloud_filtered);
    cout << "there are " << cloud_filtered->points.size() << " points after filtering." << endl;
    
    //4.显示滤波前后的点云
    pcl::visualization::CloudViewer viewer("before filetering"); //创建viewer对象
        //showCloud函数是同步的,在此处等待直到渲染结束为止
        viewer.showCloud(cloud);
    while (!viewer.wasStopped ()) { }

    pcl::visualization::CloudViewer viewer2("after filetering"); //创建viewer对象
        //showCloud函数是同步的,在此处等待直到渲染结束为止
        viewer2.showCloud(cloud_filtered);
    while (!viewer2.wasStopped ()) { }

    return 0;
}
滤波前46万个点,滤波后4万个点 体素滤波前 体素滤波后
上一篇下一篇

猜你喜欢

热点阅读