SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的



我使用了pcl的SampleConsensusPrerejective方法,效果很好。我按照教程中的描述使用它。但我不完全理解RANSAC算法是如何工作的。使用FPFH计算特征。

据我所知,该算法从输入云和目标云中提取随机特征,并将输入云投影到目标云的计算姿势上。然后计算一个CCD_ 1,并在一些迭代之后采取具有最大CCD_ 2的姿势。到目前为止还不错。

但是,这些特征是如何进行比较和姿势计算的呢?我还不明白基于点四极杆<α, ϕ, θ, d>的特征直方图是如何真正起作用的。从输入云和目标云中选取三个示例特征后,会发生什么?

有人能简单地解释下一步会发生什么吗?非常感谢!

我对这个库不太熟悉,但我可以解释RANSAC的一般功能,也可以提供一些关于他们的算法可能会做什么的想法,因为我在相关优化算法方面有很多经验。

RANSAC是一种非常通用的优化算法,设计用于在存在异常值的情况下找到解决方案。假设你得到一个线性方程a*x_i+b=y_i,你需要为给定的x_iy_i找到ab。通常简单的最小二乘法可以解决这个问题,但在存在异常值的情况下,最小二乘法失败得很惨,导致了一个完全错误的解决方案。

使用RANSAC,可以取两个随机索引i,j,找到最佳的consensus set0和b,画出这条线,并检查这条给定的线与点集(x_i,y_i)的近似程度。然后,在一系列尝试之后,您可以选择最好的一个,并将其称为解决方案或给定最佳样本集,选择具有其解决方案的总入口,并与它们进行最佳匹配。这种方法应该在给定足够样本的情况下过滤掉任何异常值,否则就会导致失败——只需要检查最终结果是否符合常识。

人们还可以玩"直线与点集的近似程度"。用户决定标准。在给定阈值的情况下最大化中间值,或最小化中间值的误差。只要有意义就行。

给定误差函数和优化机制,您可以将RANSAC应用于几乎任何优化过程。

他们的优化是如何工作的?我不知道。询问他们的开发人员,阅读他们的代码或文档。但我可以为您提供一些它可能如何工作的想法。

给定原始云中的特征点(A,B,C)和目标云中的三个匹配特征(X,Y,Z),可以确定将(A,B,C)映射到(X,Y,Z)的正正交仿射变换(旋转+移位(,或者如果它们不完全匹配,则进行最佳拟合。如果同时考虑负正交变换(反射+旋转+偏移(,而不仅仅是正正交变换,则需要四个点。这只是一个经典的线性代数。在任何情况下,四点可能是更好的解决方案的准确性,因为数据肯定是有噪声的。

在找到候选解决方案后,可以匹配整个云,看看它们是否与给定的解决方案相匹配——这就是错误函数(查看它们的实现以查看确切的标准(。

如果你只是随机地将特征A、B、C、X、Y、Z随机化,你最终会找到解决方案,但这将花费大量的时间,使其不切实际。因此,我相信他们有一些方法来减少所需的测试次数。比方说,如果他们有一个函数f,可能是一个非常错误的函数,即原始云中的每个特征都适合目标云中的匹配。然后您可以简单地检查点集合(A,B,C)(f(A),f(B),f(C))。但为了获得更好的健壮性,它们可能会有更复杂、更棘手的东西。

希望它能让你对这些算法有一些了解。

最新更新