首页 > 解决方案 > 有什么方法可以减少 Radius 异常值移除 [pcl 异常值移除] 的执行时间?

问题描述

现在我在点云中工作,在我的情况下,我的点云在异常值中很嘈杂,我想清除噪声,所以我使用 PCL 中的半径异常值过滤器。小云的执行时间不错,但时间会随着点云大小的增加而增加。

pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
 outrem.setInputCloud(box_cloud);
outrem.setRadiusSearch(0.007);
outrem.setMinNeighborsInRadius (150);
outrem.setKeepOrganized(false);
// apply filter
outrem.filter (*box_cloud);** 

就我而言,大约需要 15 秒。

寻找一种解决方案来减少这个时间。

标签: c++point-cloud-librarypoint-cloudsvision

解决方案


pcl::RadiusOutlierRemoval

遍历整个输入一次,并为每个点检索一定半径内的邻居数。

所以运行时间取决于云中的点数和搜索半径(半径越大,树查询越慢)。

可能的方法:

  1. 如果某些点绝对不是异常值,您可以使用setIndices()排除它们。例如,如果您知道所有异常值都有深色(强度 < I),那么您可以intensity < I使用pcl::PassThrough预先选择所有点索引。
  2. 减少搜索半径(以及相应的最小邻居)。
  3. 我相信该算法在内部没有并行化。因此,您可以将工作拆分为多个线程,每个线程都从云的子集中删除异常值。请注意,划分应该是空间的,而不是基于索引 -pcl::CropBox可以用于此。
  4. 近似半径去除”可以使用pcl::OctreePointCloud通过迭代叶体素并计算体素内的点数来实现(如果体素包含少于 X 个点,则应去除体素中的所有点)。

推荐阅读