PCL:如何从点云中删除偏差?
Posted
技术标签:
【中文标题】PCL:如何从点云中删除偏差?【英文标题】:PCL: How to delete deviations from a point cloud? 【发布时间】:2020-01-08 23:18:39 【问题描述】:我得到了一个点云,其中大多数点非常靠近,代表一个对象。该点云源自使用深度传感器对图像进行分割。由于一些不准确,点云也有一些与其他点有一定距离的点。就像一个自己的小点簇。您可以在此处看到这些点以红色标出:
现在我想删除这些点以进一步处理点云。这样做的最佳方法是什么?我考虑过使用k-means
之类的聚类算法进行一些聚类。但是这样做时,我需要事先知道集群的数量。而且因为这个点云是从传感器派生的,所以我并不总是有这些我想擦除的点。有时有一个集群,有时有更多。
有没有推荐的方法来解决这个问题?
我希望有任何意见。谢谢。
PS:我正在使用 c++ 和 pcl 库。
【问题讨论】:
好吧,你自己说representing **an** object
。为什么不说你只想要 1 个集群?这有点像图像侵蚀操作的 3-D 版本。也许您可以从不包含相邻邻居的像素开始(邻接是您选择的设置)?
@thatrobotguy 你说得对,我只想要一个集群。问题是,较小簇中的像素确实有相邻的邻居。
好吧,找多于1个邻居:其实试试多于1个,比如8个或9个。对于3D立方体,有27-1个邻居,所以你需要更加歧视像素 - 从头开始 - VOXELS - 找到你想要的对象。
【参考方案1】:
我建议尝试 PCL 中内置的统计异常值过滤器:http://pointclouds.org/documentation/tutorials/statistical_outlier.php
您应该能够将该示例从字面上复制到您的代码中,它会为您清除那些稀疏点(在更改两个硬编码值以适合您的场景之后)。如果你总是在看相同的场景或类似的场景,那就足够了。但是,如果您需要一个更通用的解决方案来适应可变噪声或稀疏点云,我建议您事先(在代码中)做最近邻直方图,然后做一些简单的峰值分析来设置过滤器的标准偏差。
应用此过滤器后,聚类应该变得微不足道,因为稀疏点将被删除,并且聚类之间的任何稀疏桥也将被删除。
虽然有多种聚类解决方案,但在这种情况下,我可能会选择欧几里得聚类提取(您可能不需要将体素网格作为示例中所示的前置步骤,因为您的云本质上是间隔良好的到您的传感器):http://www.pointclouds.org/documentation/tutorials/cluster_extraction.php
集群容差变量将允许您准确指定相距多远的点可以包含在同一个集群中。
【讨论】:
非常感谢您的回答。由于缺乏我的英语技能,我只是没有找到关于统计异常值的文档。在成功实现@lenik 的想法后,我尝试了这段代码,它就像一个魅力。过滤后似乎我根本不需要进行任何聚类。现在我只需要弄清楚如何导出正确的硬编码值,因为我的场景发生了很大变化。【参考方案2】:假设你有 1000 个点,从第一个点开始,找到所有的邻居,并把他们放在同一个组中,包括邻居的邻居等等。剩下任何东西,选择另一个点,创建另一个组。最终,您会将所有点分成几组,选择最大的一个,丢弃其余的(或使用某种组大小的阈值,应该丢弃 - 这取决于您的数据,您可以自己决定)。
【讨论】:
这是个好主意。我将尝试实现这一点并尝试一下。谢谢! 虽然我不能说这显然是错误的,但它没有利用 PCL 的任何内置功能,PCL 是一个非常充实的库,并且有多种工具可以解决这个问题,而不是而不是试图重新发明***。 只是为了确认。我实际上实现了这个想法并且它奏效了:) 感谢您的意见!以上是关于PCL:如何从点云中删除偏差?的主要内容,如果未能解决你的问题,请参考以下文章