三、PCL点云处理滤波器----(2)体素滤波器(下采样)

   点云的几何结构,不仅仅是宏观的几何外形,也包括其微观的排列方式,比如横向相似的尺寸、纵向的相同距离。如果使用高分辨率相机等设备对点云进行采集,往往点云会比较密集。过多的点云数量会对后续分割工作带来困难。体素格滤波器可以达到向下采样同时不破坏点云本身几何结构的功能。
   随机下采样虽然效率比体素滤波器高,但会破坏点云微观结构。使用体素化网格方法实现下采样,即可以减少点的数量,又能保存点云的形状特征,在提高配准,曲面重建、形状识别等算法速度中非常实用。

下采样:减少点云数据集中的点云数量

体素滤波器主要功能:

(1)在不破坏点云几何结构功能的前提下,减少点的数量

(2)去除一定程度的噪音点和离群点

//核心代码
std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
  << " data points (" << pcl::getFieldsList(*cloud) << ").";// 创建滤波器对象 体素网格下采样
    
    pcl::VoxelGrid<pcl::PointXYZ> sor;//设置输入的点云
    sor.setInputCloud(cloud);//点云降采样
    sor.setLeafSize(0.01f, 0.01f, 0.01f);//体素大小设置为10*10*10cm
    sor.filter(*cloud_filtered);  //执行滤波,保存结果到cloud_filtered

    std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud
//完整代码:体素滤波及可视化

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/range_image_visualizer.h> //深度图可视化
#include<pcl/visualization/cloud_viewer.h>
int main(int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    // 填入点云数据
    pcl::PCDReader reader;
    reader.read("bunny.pcd", *cloud);// 把路径改为自己存放文件的路径
    std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
        << " data points (" << pcl::getFieldsList(*cloud) << ").";// 创建滤波器对象 体素网格下采样
    
    pcl::VoxelGrid<pcl::PointXYZ> sor;//设置输入的点云
    sor.setInputCloud(cloud);//点云降采样
    sor.setLeafSize(0.01f, 0.01f, 0.01f);//体素大小设置为10*10*10cm
    sor.filter(*cloud_filtered);  //执行滤波,保存结果到cloud_filtered
    std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
        << " data points (" << pcl::getFieldsList(*cloud_filtered) << ").";

    pcl::PCDWriter writer;
    cout << "sta" << endl;
    writer.write("2d.pcd", *cloud_filtered, false);   //写入文件
    pcl::visualization::CloudViewer viewer1("ddd");//创建点云对象
    viewer1.showCloud(cloud_filtered);//显示点云
    cout << "ok" << endl;
    system("pause");
    return (0);
}

体素滤波前后对比

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值