ch08——8.3.2在PCL中使用VoxelGrid滤波器对点云进行下采样
1.本节学习如何使用体素化网格方法实现下采样,减少点的数据并保持点云的形状特征。在提高配准、曲面重建、形状识别中非常实用。PCL中的VoxelGrid类通过输入的点云数据创建一个三维体素栅格,然后在每个体素内用体素中所有点的重心来近似显示其他点,这样该体素所有点就用一个重点最终表示,这种方法比用体素中心逼近法更慢,但对于采样点对应曲面的表示更加精确。
2.代码
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <iostream>
#include <pcl/filters/voxel_grid.h>
using namespace std;
using namespace pcl;
#include <pcl/visualization/pcl_visualizer.h>
int main() {
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("D:\\pcd\\table_scene_lms400.pcd",*cloud);
cout << "pointcloud before filtering:"<<cloud->width*cloud->height<<"data points("<<pcl::getFieldsList(*cloud)<<")"<<endl;
//创建滤波器对象
pcl::VoxelGrid<pcl::PointXYZ>sor;
sor.setInputCloud(cloud);//设置输入点云
sor.setLeafSize(0.01f,0.01f,0.01f);//设置滤波时创建的体素体积为1cm³立方体
sor.filter(*cloud_filtered);//将滤波后结果放在cloud_filtered
cout<< "pointcloud after filtering:" << cloud_filtered->width*cloud_filtered->height << "data points(" << pcl::getFieldsList(*cloud_filtered) << ")";
//写入文文件
pcl::PCDWriter wr;
wr.write("D:\\pcd\\table_scene_lms400_downsampled.pcd", *cloud_filtered);
return 0;
}
3.显示
过滤前:
过滤后:
版权声明:本文为weixin_48240054原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。