首页 > 解决方案 > 如何去除 PCL 中的异常点以进行基于区域增长的表面检测

问题描述

我正在使用 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 中区域生长方法中的密度阈值来避免这种情况?在花了一些时间在文档上并调整了区域增长设置的值之后,我仍然无法弄清楚如何去做。

离群点

标签: 3dcomputer-visionpoint-cloud-librarypoint-cloudslidar-data

解决方案


RegionGrowing 不考虑“候选”点的距离。包含决策基于正常数据,而实际候选者来自 K 最近邻查询。

所以你有一个选择是减少 NumberOfNeighbours 参数。这是最简单的,只能部分起作用,因为它不能直接解决问题(点距离)。在您发布的示例中,您可能需要将其减少到大约 6。这可能会导致分割的整体结果更差,并且您可能在其他地方仍有异常值。

更好的解决方案是使用半径异常值去除作为后处理步骤来过滤您从 RegionGrowing 获得的每个区域。

http://pointclouds.org/documentation/tutorials/remove_outliers.php


推荐阅读