#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>      // 点类型定义头文件
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h> //点云显示头文件
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/statistical_outlier_removal.h> //统计滤波器头文件
#include <pcl/registration/gicp.h>
#include <pcl/registration/icp.h> // ICP配准类相关的头文件
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree_flann.h>

using namespace std;

int main()
{
   // 加载源点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source(new pcl::PointCloud<pcl::PointXYZ>());
	pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\PCL\\rabbit.pcd", *cloud_source);
	cout << "源点云加载完成!" << endl;

    // 创建统计滤波器对象
	pcl::StatisticalOutlierRemoval<pcl::PointXYZ> staticOR;
	staticOR.setInputCloud(cloud_source);
	staticOR.setMeanK(20);   // 设置统计平均点数,增加MeanK的值会使每个点的邻域变大
	staticOR.setStddevMulThresh(1);   // 设置标准差倍数阈值,增加StddevMulThresh的值会减少被移除的点的数量

	// 进行滤波
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>());
	staticOR.filter(*cloud_filtered);//cloud_filtered 将用于存储经过离群点移除处理后的点云数据。
	cloud_source = cloud_filtered;
	cout << "源点云滤波完成!" << endl;

    // 对源点云进行VoxelGrid降采样
	pcl::VoxelGrid<pcl::PointXYZ> sor;
	sor.setInputCloud(cloud_source);
	sor.setLeafSize(0.005f, 0.005f, 0.005f); // 设置体素大小
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source_subsampled(new pcl::PointCloud<pcl::PointXYZ>());
	sor.filter(*cloud_source_subsampled);

    // 保存点云到文件
	pcl::io::savePCDFileBinary("D:\\PCL\\rabbit1.pcd", *cloud_source_subsampled);
	cout << "滤波后点云文件已经保存" << endl;

    return 0;
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐