OpenCV RANSAC returns 每次都进行相同的转换
OpenCV RANSAC returns the same transformation everytime
我对如何使用 OpenCV findHomography
方法计算最佳变换感到困惑。
我的使用方法如下:
cv::Mat h = cv::findHomography(src, dst, CV_RANSAC, 5.f);
无论我运行多少次,我得到的都是相同的变换矩阵。我认为 RANSAC 应该随机 select 点的子集来进行拟合,那么为什么它每次都 return 相同的变换矩阵?它与一些随机数初始化有关吗?我怎样才能使这种行为实际上是随机的?
其次,如何调整此设置中的 RANSAC 迭代次数?通常迭代次数基于内点比率和诸如此类的东西。
findHomography 已经为您提供了 最佳 转换。真正的问题是关于 optimal.
的含义
例如,使用 RANSAC
您将拥有最大内点数的模型,而使用 LMEDS
您将拥有最小中值误差的模型。
您可以通过以下方式修改默认行为:
- 通过设置
maxIters
更改 RANSAC
的迭代次数(允许的最大次数为 2000)
- 减少(增加)用于验证异常值(通常在 1 到 10 之间)的
ransacReprojThreshold
。
关于你的问题。
No matter how many times I run it, I get the same transformation matrix.
可能你的观点足够好,你总能找到最优模型。
I thought RANSAC is supposed to randomly select a subset of points to do the fitting
RANSAC(RANdom SAmple Consensus)首先 selects 一个随机子集,检查用这些点构建的模型是否足够好。如果不是,它 select 是另一个随机子集。
How can I make this behaviour actually random?
我无法想象这会有用的场景,但您可以随机 select 来自 src
和 dst
的 4 对点,然后使用 getPerspectiveTransform.除非你的观点是完美的,否则你会得到每个子集的不同矩阵。
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 重复 selects 点的子集,然后根据它们拟合模型,然后检查数据集中有多少数据点是内点模型。完成多次后,它会选择具有最多内点的拟合模型,并将模型重新拟合到这些内点。
对于任何给定的数据集、可变模型参数集和构成异常值的规则,将存在一个或多个(但通常恰好是一个)最大可能集 "inliers"。例如,给定此数据集(图像 from Wikipedia):
...然后通过某种合理的离群值定义,任何线性模型可以拥有的最大可能的离群值集是下面的蓝色:
我们称上面的蓝色点集为最大可能的内点集-I.
如果您随机 select 少量点(例如两个或三个)并通过它们绘制一条最适合的线,希望直觉上很明显它只会让您尝试几次直到你点击了一个迭代,其中:
- 你选择的所有随机select点都来自I,所以
- 通过这些点的最佳拟合线大致等于上图中的最佳拟合线,因此
- 在该迭代中找到的一组内点恰好是 I
从那次迭代开始,所有进一步的迭代都是一种浪费,不可能进一步改进模型(尽管 RANSAC 无法知道这一点,因为它无法神奇地知道何时找到最大的内点集)。
如果相对于数据集的大小,迭代次数足够多,并且数据集中有足够大的比例是内点,那么您最终会找到接近 100 的最大内点集% 机会每次你 运行 RANSAC。因此,RANSAC 将(几乎)总是输出完全相同的模型。
这是一件好事!通常,您希望 RANSAC 找到绝对最大的内点集并且不想满足于任何更少的东西。如果您在这种情况下每次 运行 RANSAC 时都得到不同的结果,则表明您想要增加迭代次数。
(当然,在上面的例子中,我们讨论的是尝试通过二维平面中的点拟合一条线,这不是 findHomography
所做的,但原理是相同的;有通常仍然是单个最大内点集,最终 RANSAC 会找到它。)
How can I make this behaviour actually random?
减少迭代次数 (maxIters
),使 RANSAC 有时无法找到最大的内点集。
但除了纯粹的求知欲外,通常没有理由这样做;您基本上会故意告诉 RANSAC 输出劣质模型。
我对如何使用 OpenCV findHomography
方法计算最佳变换感到困惑。
我的使用方法如下:
cv::Mat h = cv::findHomography(src, dst, CV_RANSAC, 5.f);
无论我运行多少次,我得到的都是相同的变换矩阵。我认为 RANSAC 应该随机 select 点的子集来进行拟合,那么为什么它每次都 return 相同的变换矩阵?它与一些随机数初始化有关吗?我怎样才能使这种行为实际上是随机的?
其次,如何调整此设置中的 RANSAC 迭代次数?通常迭代次数基于内点比率和诸如此类的东西。
findHomography 已经为您提供了 最佳 转换。真正的问题是关于 optimal.
的含义例如,使用 RANSAC
您将拥有最大内点数的模型,而使用 LMEDS
您将拥有最小中值误差的模型。
您可以通过以下方式修改默认行为:
- 通过设置
maxIters
更改RANSAC
的迭代次数(允许的最大次数为 2000) - 减少(增加)用于验证异常值(通常在 1 到 10 之间)的
ransacReprojThreshold
。
关于你的问题。
No matter how many times I run it, I get the same transformation matrix.
可能你的观点足够好,你总能找到最优模型。
I thought RANSAC is supposed to randomly select a subset of points to do the fitting
RANSAC(RANdom SAmple Consensus)首先 selects 一个随机子集,检查用这些点构建的模型是否足够好。如果不是,它 select 是另一个随机子集。
How can I make this behaviour actually random?
我无法想象这会有用的场景,但您可以随机 select 来自 src
和 dst
的 4 对点,然后使用 getPerspectiveTransform.除非你的观点是完美的,否则你会得到每个子集的不同矩阵。
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 重复 selects 点的子集,然后根据它们拟合模型,然后检查数据集中有多少数据点是内点模型。完成多次后,它会选择具有最多内点的拟合模型,并将模型重新拟合到这些内点。
对于任何给定的数据集、可变模型参数集和构成异常值的规则,将存在一个或多个(但通常恰好是一个)最大可能集 "inliers"。例如,给定此数据集(图像 from Wikipedia):
...然后通过某种合理的离群值定义,任何线性模型可以拥有的最大可能的离群值集是下面的蓝色:
我们称上面的蓝色点集为最大可能的内点集-I.
如果您随机 select 少量点(例如两个或三个)并通过它们绘制一条最适合的线,希望直觉上很明显它只会让您尝试几次直到你点击了一个迭代,其中:
- 你选择的所有随机select点都来自I,所以
- 通过这些点的最佳拟合线大致等于上图中的最佳拟合线,因此
- 在该迭代中找到的一组内点恰好是 I
从那次迭代开始,所有进一步的迭代都是一种浪费,不可能进一步改进模型(尽管 RANSAC 无法知道这一点,因为它无法神奇地知道何时找到最大的内点集)。
如果相对于数据集的大小,迭代次数足够多,并且数据集中有足够大的比例是内点,那么您最终会找到接近 100 的最大内点集% 机会每次你 运行 RANSAC。因此,RANSAC 将(几乎)总是输出完全相同的模型。
这是一件好事!通常,您希望 RANSAC 找到绝对最大的内点集并且不想满足于任何更少的东西。如果您在这种情况下每次 运行 RANSAC 时都得到不同的结果,则表明您想要增加迭代次数。
(当然,在上面的例子中,我们讨论的是尝试通过二维平面中的点拟合一条线,这不是 findHomography
所做的,但原理是相同的;有通常仍然是单个最大内点集,最终 RANSAC 会找到它。)
How can I make this behaviour actually random?
减少迭代次数 (maxIters
),使 RANSAC 有时无法找到最大的内点集。
但除了纯粹的求知欲外,通常没有理由这样做;您基本上会故意告诉 RANSAC 输出劣质模型。