PCL,SACSegmentation检测球体

PCL, SACSegmentation detecting spheres

我正在尝试使用 RANSAC pcl::sacSegmentation 从点云中查找球体。从一个站用精确的地面扫描仪扫描云。云密度约为1cm。迄今为止最好的结果如下图所示。如您所见,云包含 2 个球体 (r=7,25cm) 和一个连接球的钢梁。我能够找到三个候选球体,它们的内点是从图像中的云中提取的(您可以看到两个球体附近光束上的圆形)。

Input point cloud. Inlier points extracted

所以,看来我很接近了。发现的球体中心仍然与事实相差太多(~10cm)。有什么建议我可以改进吗?我一直在调整模型参数有一段时间了。以下是上述结果的参数:

seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_SPHERE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setMaxIterations(500000);       
seg.setDistanceThreshold(0.0020);    
seg.setProbability(0.99900); 
seg.setRadiusLimits(0.06, 0.08);
seg.setInputCloud(cloud);

我还尝试通过在模型中包含点法线来改进结果,但没有更好的结果。但是还有几个参数需要调整,所以可能有一些我没有尝试过的组合。

如果需要,我很乐意为您提供更多信息。

萨克斯 奈赫乌

经过一番调查后,我得出结论,我无法从包含许多不属于任何球体形状的其他点的云中找到具有 SACSegmentation 的球体。就像我的情况一样,光束对于算法来说太大了。 因此,我必须选择那些显示出某些可能成为球体形状一部分的点。我还认为,我需要将属于不同领域的点分开。我测试并发现如果输入云只有带有一些“自然”噪声的单个球体的球体点,我的代码工作得很好。

有些人通过先提取属于平面的所有点然后搜索球体来解决这个问题。其他人使用目标的颜色(在相机的情况下)来提取只需要的点。

删除平面点应该适用于我的示例云,但我的应用程序可能也有更复杂的形状,所以它可能太简单了..

..最后,我用 pcl::EuclideanClusterExtraction 对云进行聚类,并逐个为球体搜索提供聚类,得到了满意的结果。