有啥方法可以减少 Radius 异常值删除 [pcl 异常值删除] 的执行时间?
Posted
技术标签:
【中文标题】有啥方法可以减少 Radius 异常值删除 [pcl 异常值删除] 的执行时间?【英文标题】:Is there any way to reduce execution time of Radius outlier removal [pcl outlier removal]?有什么方法可以减少 Radius 异常值删除 [pcl 异常值删除] 的执行时间? 【发布时间】:2020-12-23 14:06:04 【问题描述】:现在我在点云中工作,就我而言,我的点云在异常值中很嘈杂,我想清除噪声,所以我使用 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 秒。
寻找一种解决方案来减少这个时间。
【问题讨论】:
【参考方案1】:pcl::RadiusOutlierRemoval
遍历整个输入一次,并为每个点检索一定半径内的邻居数。
所以运行时间取决于云中的点数和搜索半径(半径越大,树查询越慢)。
可能的方法:
-
如果某些点绝对不是异常值,您可以使用:setIndices() 排除它们。例如,如果您知道所有异常值都具有深色(强度 pcl::PassThrough 预先选择带有
intensity < I
的所有点索引。
减少搜索半径(以及相应的最小邻居)。
我相信算法内部没有并行化。因此,您可以将工作拆分为多个线程,每个线程都从云的子集中删除异常值。请注意,划分应该是空间的,而不是基于索引 - pcl::CropBox
可以用于此。
“近似半径去除”可以使用pcl::OctreePointCloud通过迭代叶体素并计算体素内的点数来实现(如果体素包含少于X个点,那么体素中的所有点都应该被删除)。
【讨论】:
以上是关于有啥方法可以减少 Radius 异常值删除 [pcl 异常值删除] 的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章
oracle中有一亿多行数据的表,要全表更新某字段值,有啥号的方法?
网格搜索需要 30 多分钟,有啥方法可以减少这种情况吗? (朱庇特天青)