[done, 960.866 ms : 460400 points]
Available dimensions: x y z intensity distance sid
table_scene_lms400.pcd
[done, 1414.24 ms : 451410 points]
Available dimensions: x y z
table_scene_lms400_inliers.pcd
[done, 412.985 ms : 8990 points]
Available dimensions: x y z
table_scene_lms400_outliers.pcd
这段代码是一个使用PCL (Point Cloud Library) 进行点云数据处理的C++程序。程序的主要目的是移除统计学上的异常值(outliers)来清洗数据。
首先,代码包含了所需的库文件,这些库提供了点云处理的相关功能,包括输入/输出操作和定义点类型等。
接着,定义了主函数
main
,程序的执行从这里开始。在主函数中,声明了两个点云对象的指针:
cloud
和cloud_filtered
。其中cloud
用于存储原始数据,而cloud_filtered
用于存储过滤后的数据。然后使用
pcl::PCDReader
对象读取一个PCD文件(点云数据文件),路径为 "table_scene_lms400.pcd"。此文件需要提前存在于指定路径。输出原始点云数据的信息,以便于观察过滤之前的数据状态。
创建了一个过滤器对象
pcl::StatisticalOutlierRemoval<pcl::PointXYZ>
,这个对象可以通过统计分析来移除点云中的异常值。设置过滤器参数:
setMeanK
设定邻近点的数量,setStddevMulThresh
设定标准差乘数阈值,这些参数用于定义什么样的点被认为是异常值。通过调用过滤器的
filter
方法执行过滤操作,并将结果存储到cloud_filtered
。输出过滤后的点云数据的信息,以便于观察对比。
使用
pcl::PCDWriter
对象将过滤后保留的数据写入到一个新的PCD文件 "table_scene_lms400_inliers.pcd"。设置过滤器的
setNegative
为true
,这样可以获取所有被认为是异常值的点。再次执行过滤操作,并将结果写入到另一个新文件 "table_scene_lms400_outliers.pcd",用于保存异常值点云。
整体上,这段代码实现了对点云数据中异常值的识别和移除,可以用于数据的预处理以提高后续处理步骤的准确性。
终端输出:
Cloud before filtering:
header: seq: 0 stamp: 0 frame_id:
points[]: 460400
width: 460400
height: 1
is_dense: 1
sensor origin (xyz): [0, 0, 0] / orientation (xyzw): [0, 0, 0, 1]
Cloud after filtering:
header: seq: 0 stamp: 0 frame_id:
points[]: 451410
width: 451410
height: 1
is_dense: 1
sensor origin (xyz): [0, 0, 0] / orientation (xyzw): [0, 0, 0, 1]
#include <iostream> // 引入iostream库,用于输入输出
#include <pcl/io/pcd_io.h> // 引入pcl库中的pcd_io模块,用于读取和保存PCD文件
#include <pcl/point_types.h> // 引入pcl库中的point_types模块,定义了各种类型的点云
#include <pcl/filters/statistical_outlier_removal.h> // 引入pcl库中的statistical_outlier_removal模块,用于统计离群值移除滤波
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; // 创建一个PCD文件读取对象
// 用reader对象读取PCD文件,文件路径需替换为实际路径
reader.read<pcl::PointXYZ> ("table_scene_lms400.pcd", *cloud);
// 输出原始的点云数据大小
std::cerr << "Cloud before filtering: " << std::endl;
std::cerr << *cloud << std::endl;
// 创建离群值滤波处理对象
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; // 创建滤波器对象
sor.setInputCloud (cloud); // 设置输入点云
sor.setMeanK (50); // 设置在进行统计时考虑的临近点个数
sor.setStddevMulThresh (1.0); // 设置判断是否为离群值的阈值乘数
sor.filter (*cloud_filtered); // 执行滤波,过滤后的点云存储在cloud_filtered中
// 输出滤波后的点云数据大小
std::cerr << "Cloud after filtering: " << std::endl;
std::cerr << *cloud_filtered << std::endl;
// 保存滤波后的点云到PCD文件
pcl::PCDWriter writer; // 创建一个PCD文件写入对象
writer.write<pcl::PointXYZ> ("table_scene_lms400_inliers.pcd", *cloud_filtered, false);
// 将离群值反转,即获得所有被认为是离群值的点云
sor.setNegative (true);
sor.filter (*cloud_filtered);
// 保存这部分离群值点云到另一个PCD文件
writer.write<pcl::PointXYZ> ("table_scene_lms400_outliers.pcd", *cloud_filtered, false);
return (0); // 程序正常退出
}
这段C++代码使用了PCL(Point Cloud Library)库,主要功能是读取一个PCD(点云数据)文件,对其中的数据进行统计学离群值滤波处理,然后将滤波后的点云和被识别出的离群值点云分别保存为新的PCD文件。统计学离群值滤波是一种用来剔除离群点(例如由噪声或其他原因产生的不正确测量值)的方法,它通过计算每一个点的邻域内其他点的距离分布情况,将那些不符合特定标准差乘数的点标记为离群值,并进行过滤。这在点云的预处理中是一个常用的步骤,可以改善后续处理的结果,如点云配准、表面重建等。
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;