c++ - 有什么方法可以减少 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 秒。
寻找一种解决方案来减少这个时间。
解决方案
遍历整个输入一次,并为每个点检索一定半径内的邻居数。
所以运行时间取决于云中的点数和搜索半径(半径越大,树查询越慢)。
可能的方法:
- 如果某些点绝对不是异常值,您可以使用setIndices()排除它们。例如,如果您知道所有异常值都有深色(强度 < I),那么您可以
intensity < I
使用pcl::PassThrough预先选择所有点索引。 - 减少搜索半径(以及相应的最小邻居)。
- 我相信该算法在内部没有并行化。因此,您可以将工作拆分为多个线程,每个线程都从云的子集中删除异常值。请注意,划分应该是空间的,而不是基于索引 -
pcl::CropBox
可以用于此。 - “近似半径去除”可以使用pcl::OctreePointCloud通过迭代叶体素并计算体素内的点数来实现(如果体素包含少于 X 个点,则应去除体素中的所有点)。
推荐阅读
- python-3.x - 计算最终金额的折扣
- php - 通过 YouTube 数据 API 上传的视频将变为私有视频
- jmeter - Jmeter 是否支持将 Jmx 文件直接导入 azure devops
- node.js - 如何使用 OAEP 使用此公钥加密数据
- azure - Azure Pipelines YAML 源
- javascript - 提交时未清空 SimpleMDE 组件
- r - R data.table:如何合并 data.tables 列表?
- json - 如何将模型 json 绑定到控制器中的组合框?
- c# - 为我的标签使用内置表单控件时,在我的输入文本框前面加上星号
- java - Android Studio 无法使用 Wrap 内容时,如何为不同屏幕尺寸的多种布局配置应用程序?