PCL: 如何删除点云的偏差?
PCL: How to delete deviations from a point cloud?
我得到了一个点云,其中大多数点都非常靠近,代表一个对象。该点云源自使用深度传感器对图像进行的分割。由于一些不准确,点云也有一些点与其他点有一定距离。就像自己的一小群点。您可以在此处看到以红色勾勒出的这些要点:
现在我想删除这些点以进一步处理点云。这样做的最佳方法是什么?我考虑过使用像 k-means
这样的聚类算法进行一些聚类。但是这样做时我需要事先知道集群的数量。而且因为这个点云来自传感器,所以我并不总是想要删除这些点。有时成群,有时成群。
有什么推荐的方法可以解决这个问题吗?
我会喜欢任何输入。谢谢
PS:我正在使用 C++ 和 pcl 库。
比方说,你有1000分,从第一个点开始,找到所有的邻居,把他们放在同一个组里,包括邻居的邻居等等。用剩下的东西,选择另一个点,创建另一个组。最终你会把所有的点分成几组,选择最大的一组,放弃其余的(或者使用某种组大小的阈值,应该放弃——这取决于你的数据,你可以自己决定)。
我建议尝试 PCL 内置的统计离群值过滤器:http://pointclouds.org/documentation/tutorials/statistical_outlier.php
您应该能够将该示例逐字复制到您的代码中,它会为您清除那些稀疏点(在更改两个硬编码值以适合您的场景之后)。如果你总是看同一个场景或相似的场景,那就足够了。但是,如果您需要一个更通用的解决方案来适应可变噪声或稀疏点云,我建议您事先(在代码中)做最近邻直方图,然后做一些简单的峰值分析来设置过滤器的标准偏差。
应用此过滤器后,聚类应该变得微不足道,因为稀疏点将被删除,并且聚类之间的任何稀疏桥也将成为删除的目标。
虽然有多种聚类解决方案,但在这种情况下,我可能会选择欧几里得聚类提取(您可能不需要像示例中所示的预处理步骤那样执行体素网格,因为您的云本身就很好由于您的传感器而间隔):http://www.pointclouds.org/documentation/tutorials/cluster_extraction.php
聚类容差变量将允许您准确指定在同一聚类中可以包含多远的点。
我得到了一个点云,其中大多数点都非常靠近,代表一个对象。该点云源自使用深度传感器对图像进行的分割。由于一些不准确,点云也有一些点与其他点有一定距离。就像自己的一小群点。您可以在此处看到以红色勾勒出的这些要点:
现在我想删除这些点以进一步处理点云。这样做的最佳方法是什么?我考虑过使用像 k-means
这样的聚类算法进行一些聚类。但是这样做时我需要事先知道集群的数量。而且因为这个点云来自传感器,所以我并不总是想要删除这些点。有时成群,有时成群。
有什么推荐的方法可以解决这个问题吗?
我会喜欢任何输入。谢谢
PS:我正在使用 C++ 和 pcl 库。
比方说,你有1000分,从第一个点开始,找到所有的邻居,把他们放在同一个组里,包括邻居的邻居等等。用剩下的东西,选择另一个点,创建另一个组。最终你会把所有的点分成几组,选择最大的一组,放弃其余的(或者使用某种组大小的阈值,应该放弃——这取决于你的数据,你可以自己决定)。
我建议尝试 PCL 内置的统计离群值过滤器:http://pointclouds.org/documentation/tutorials/statistical_outlier.php
您应该能够将该示例逐字复制到您的代码中,它会为您清除那些稀疏点(在更改两个硬编码值以适合您的场景之后)。如果你总是看同一个场景或相似的场景,那就足够了。但是,如果您需要一个更通用的解决方案来适应可变噪声或稀疏点云,我建议您事先(在代码中)做最近邻直方图,然后做一些简单的峰值分析来设置过滤器的标准偏差。
应用此过滤器后,聚类应该变得微不足道,因为稀疏点将被删除,并且聚类之间的任何稀疏桥也将成为删除的目标。
虽然有多种聚类解决方案,但在这种情况下,我可能会选择欧几里得聚类提取(您可能不需要像示例中所示的预处理步骤那样执行体素网格,因为您的云本身就很好由于您的传感器而间隔):http://www.pointclouds.org/documentation/tutorials/cluster_extraction.php
聚类容差变量将允许您准确指定在同一聚类中可以包含多远的点。