gpt4 book ai didi

OpenCV RANSAC 每次都返回相同的转换

转载 作者:太空宇宙 更新时间:2023-11-03 22:00:39 34 4
gpt4 key购买 nike

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

我的使用方式如下:

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

无论我运行多少次,我都会得到相同的变换矩阵。我以为 RANSAC 应该随机选择一个点的子集来进行拟合,那么为什么它每次都返回相同的变换矩阵呢?它与一些随机数初始化有关吗?我怎样才能使这种行为实际上是随机的?

其次,如何调整此设置中的 RANSAC 迭代次数?通常迭代次数基于内点比率和诸如此类的东西。

最佳答案

I thought RANSAC is supposed to randomly select a subset of points to do the fitting, so why does it return the same transformation matrix every time?

RANSAC 反复选择点的一个子集,然后根据它们拟合模型,然后检查数据集中有多少数据点是给定拟合模型的内点。完成多次后,它会选择具有最多内点的拟合模型,并将模型重新拟合到这些内点。

对于任何给定的数据集、可变模型参数集和构成异常值的规则,将存在一个或多个(但通常恰好是一个)最大可能的“异常值”集。例如,给定此数据集(图像 from Wikipedia):

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

从那次迭代开始,所有进一步的迭代都是浪费,不可能进一步改进模型(尽管 RANSAC 无法知道这一点,因为它无法神奇地知道何时找到最大的内点集)。

如果相对于数据集的大小,迭代次数足够多,并且数据集中有足够大的比例是内点,那么您最终会以接近 100% 的几率找到最大的内点集每次运行 RANSAC 时。因此,RANSAC 将(几乎)总是输出完全相同的模型。

这是一件好事!通常,您希望 RANSAC 找到绝对最大的一组内点并且不想满足于任何更少的东西。如果您在这种情况下每次运行 RANSAC 时都得到不同的结果,则表明您想要增加迭代次数。

(当然,在上面的例子中,我们讨论的是尝试通过二维平面中的点拟合一条线,这不是 findHomography 所做的,但原理是相同的;通常仍然会有一组最大的内点,最终 RANSAC 会找到它。)

How can I make this behaviour actually random?

减少迭代次数 (maxIters),以便 RANSAC 有时无法找到最大的内点集。

但除了纯粹的求知欲外,通常没有理由这样做;您基本上会故意告诉 RANSAC 输出劣质模型。

关于OpenCV RANSAC 每次都返回相同的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32036021/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com