OpenCV RANSAC每次返回相同的变换

4

我对如何使用OpenCV的findHomography方法计算最佳转换感到困惑。

我的使用方式如下:

cv::Mat h = cv::findHomography(src, dst, CV_RANSAC, 5.f);

无论我运行多少次,都会得到相同的变换矩阵。 我以为RANSAC应该随机选择一部分点来进行拟合,那么为什么它每次都返回相同的变换矩阵? 这与某些随机数初始化有关吗? 我该如何使此行为实际上是随机的?
其次,在这种设置中如何调整RANSAC迭代次数? 通常,迭代次数基于内点比率等因素。

RANSAC方法可以配置为自动选择迭代次数,或在选择“正确”模型的概率足够高时停止迭代。有关详细信息,请阅读Zisserman。可能openCV使用该方法,并且可能始终在您的数据中找到该模型。 - Micka
只是提供更多信息,如 https://answers.opencv.org/question/86554/opencv-ransac-random-sequence/ 所指出的,openCV固定了随机种子以获取样本。因此,如果参数未更改,则始终会获得相同的结果。 - Javier TG
2个回答

4
我认为RANSAC应该随机选择一部分点进行拟合,那么为什么它每次都返回相同的变换矩阵?
RANSAC会反复选择一部分点,然后基于这些点进行模型拟合,然后检查在给定该拟合模型的情况下,数据集中有多少数据点是内点。一旦完成了许多次这样的操作,它就会选择具有最多内点的拟合模型,并将模型重新拟合到这些内点上。
对于任何给定的数据集、可变模型参数集和构成内点的规则,都会存在一个或多个(但通常只有一个)最大可能的“内点”集。例如,给定这个数据集(来自维基百科的图像)。

A graph showing a straight line of points, with a bunch of random outliers scattered around

...然后通过一些合理的异常值定义,任何线性模型可能具有的最大内点集是下面的蓝色集合:

Same image as before, but with the inliers in blue, the outliers in red, and a blue line of best fit through the inliers

让我们称上面的蓝点集为最大可能的内点集合 - I
如果您随机选择少量点(例如两个或三个),并通过它们绘制最佳拟合线,那么很明显,只需要几次尝试就可以达到以下迭代:
- 所有随机选择的点都来自I,因此 - 通过这些点的最佳拟合线大致等于上图中的最佳拟合线,因此 - 在该迭代中找到的内点集合正好是I 从那一次迭代开始,所有进一步的迭代都是无用的,不能进一步改善模型(尽管RANSAC不知道何时找到了最大的内点集合)。
如果您拥有足够数量的迭代次数相对于数据集的大小,并且足够大比例的数据集是内点,则每次运行RANSAC时您最终都将以接近100%的概率找到最大的内点集。因此,RANSAC将(几乎)总是输出完全相同的模型。
这是一件好事情!通常,您希望RANSAC找到绝对最大的内点集,不想妥协。如果在这种情况下每次运行RANSAC都得到不同的结果,则表明您需要增加迭代次数。
(当然,在上面的情况下,我们谈论的是尝试通过2D平面中的点拟合一条线,而这不是findHomography所做的,但原理是相同的;通常仍会有一个单一的最大内点集,最终RANSAC将找到它。)
如何使此行为实际随机?
减少迭代次数(maxIters),以便RANSAC有时无法找到最大的内点集。
但是除了纯粹的学术好奇心外,通常没有理由这样做;您基本上正在故意告诉RANSAC输出较差的模型。

3

findHomography已经能够给出最优的变换。实际问题在于“最优”这个词的含义。

例如,使用RANSAC,您将得到具有最大内点数的模型,而使用LMEDS,您将得到具有最小中位误差的模型。

您可以通过以下方式修改默认行为:

  • 通过设置maxIters(允许的最大迭代次数为2000)来更改RANSAC的迭代次数。
  • 减少(或增加)用于验证内点和外点的ransacReprojThreshold的阈值(通常介于1和10之间)。

关于您的问题。

无论我运行多少次,都会得到相同的变换矩阵。

可能您的点足够好,总是能找到最优的模型。

我认为RANSAC应该随机选择一部分点进行拟合

RANSAC(随机抽样一致性)首先选择一部分随机点,然后检查使用这些点构建的模型是否足够好。如果不是,则选择另一组随机点。

如何使这种行为真正随机?

我想象不出这种情况有用的场景,但您可以从srcdst中随机选择4对点,并使用getPerspectiveTransform。除非您的点是完美的,否则每个子集都将得到不同的矩阵。


使用RANSAC算法,您将得到具有最小重投影误差的模型 - 实际上,您将得到具有最大内点数量的模型,这不一定是具有最小重投影误差的模型。 - Miau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接