Как убрать точки выброса в 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? Потратив некоторое время на документацию и откорректировав значения для настройки по регионам, я все еще не мог понять, как это сделать.
1 ответ
RegionGrowing не учитывает расстояние "кандидатов" баллов. Решение о включении основывается на обычных данных, а фактические кандидаты являются результатом запроса K ближайших соседей.
Таким образом, у вас есть возможность уменьшить параметр NumberOfNeighbours. Это самый простой способ, который будет работать только частично, поскольку он не решает проблему (расстояние до точки) напрямую. В опубликованном вами примере вам, вероятно, потребуется уменьшить его примерно до 6. Это может привести к общим худшим результатам для сегментации, и у вас все еще могут быть выбросы в других местах.
Лучшее решение - использовать удаление радиусов в качестве шага постобработки, чтобы отфильтровать все области, которые вы получили из RegionGrowing.
http://pointclouds.org/documentation/tutorials/remove_outliers.php