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