如何删除 PCL 中的离群点以进行基于区域生长的表面检测
how to remove outlier points in PCL for region grow based surface detection
我正在使用 PCL 检测我的激光雷达点云中的表面,我的配置如下:
pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
reg.setMinClusterSize(static_cast<int>(100));
reg.setMaxClusterSize(static_cast<int>(1000));
reg.setSearchMethod(new pcl::search::KdTree<pcl::PointXYZ>);
reg.setNumberOfNeighbours(30);
reg.setInputCloud(point_cloud);
reg.setInputNormals(normals);
reg.setSmoothnessThreshold(6_deg);
reg.setCurvatureThreshold(1.0);
它工作正常,除了我发现它拾取了一些异常点,如下图所示。
我试图检测带有腿的飞机,似乎该方法在腿上拾取了一些点。在PCL中的区域生长方法中是否有办法避免使用例如密度阈值来避免这样的点?在花了一些时间阅读文档并调整了区域增长设置的值之后,我仍然不知道该怎么做。
RegionGrowing 不考虑 "candidatee" 点的距离。包含决策基于正常数据,而实际候选结果来自K个最近邻居查询。
因此,您可以选择减少 NumberOfNeighbours 参数。这是最简单的,它只能部分起作用,因为它不能直接解决问题(点距离)。在您发布的示例中,您可能需要将其减少到大约 6。这可能会导致整体分割结果更差,并且您可能在其他地方仍有异常值。
更好的解决方案是使用半径异常值移除作为后处理步骤来过滤您从 RegionGrowing 获得的每个区域。
http://pointclouds.org/documentation/tutorials/remove_outliers.php
我正在使用 PCL 检测我的激光雷达点云中的表面,我的配置如下:
pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
reg.setMinClusterSize(static_cast<int>(100));
reg.setMaxClusterSize(static_cast<int>(1000));
reg.setSearchMethod(new pcl::search::KdTree<pcl::PointXYZ>);
reg.setNumberOfNeighbours(30);
reg.setInputCloud(point_cloud);
reg.setInputNormals(normals);
reg.setSmoothnessThreshold(6_deg);
reg.setCurvatureThreshold(1.0);
它工作正常,除了我发现它拾取了一些异常点,如下图所示。
我试图检测带有腿的飞机,似乎该方法在腿上拾取了一些点。在PCL中的区域生长方法中是否有办法避免使用例如密度阈值来避免这样的点?在花了一些时间阅读文档并调整了区域增长设置的值之后,我仍然不知道该怎么做。
RegionGrowing 不考虑 "candidatee" 点的距离。包含决策基于正常数据,而实际候选结果来自K个最近邻居查询。
因此,您可以选择减少 NumberOfNeighbours 参数。这是最简单的,它只能部分起作用,因为它不能直接解决问题(点距离)。在您发布的示例中,您可能需要将其减少到大约 6。这可能会导致整体分割结果更差,并且您可能在其他地方仍有异常值。
更好的解决方案是使用半径异常值移除作为后处理步骤来过滤您从 RegionGrowing 获得的每个区域。
http://pointclouds.org/documentation/tutorials/remove_outliers.php