OpenCV RANSAC 每次都返回相同的转换
Posted
技术标签:
【中文标题】OpenCV RANSAC 每次都返回相同的转换【英文标题】:OpenCV RANSAC returns the same transformation everytime 【发布时间】:2015-11-09 05:48:35 【问题描述】:我对如何使用 OpenCV findHomography
方法来计算最佳变换感到困惑。
我的使用方式如下:
cv::Mat h = cv::findHomography(src, dst, CV_RANSAC, 5.f);
无论我运行多少次,我都会得到相同的转换矩阵。我认为 RANSAC 应该随机选择一个点子集来进行拟合,那为什么每次都返回相同的变换矩阵呢?它与一些随机数初始化有关吗?我怎样才能使这种行为实际上是随机的?
其次,如何调整此设置中的 RANSAC 迭代次数?通常迭代次数基于内部比率等。
【问题讨论】:
RANSAC 方法可以配置为自动选择迭代次数,或者在我们选择“正确”模型的概率足够高时停止迭代。阅读齐瑟曼了解详情。可能 openCV 使用该方法,并且它可能总是在您的数据中找到该模型。 【参考方案1】:findHomography 已经为您提供了最佳 转换。真正的问题是关于最佳的含义。
例如,使用RANSAC
,您将拥有具有最大内点数的模型,而使用LMEDS
,您将拥有具有最小中值误差的模型。
您可以通过以下方式修改默认行为:
通过设置maxIters
更改 RANSAC
的迭代次数(允许的最大次数为 2000)
减少(增加)用于验证内点和异常点的ransacReprojThreshold
(通常在 1 到 10 之间)。
关于你的问题。
无论我运行多少次,我都会得到相同的变换矩阵。
可能你的观点足够好,你总是能找到最佳模型。
我认为 RANSAC 应该随机选择一个点子集来进行拟合
RANSAC(RANdom SAmple Consensus)首先选择一个随机子集,检查用这些点构建的模型是否足够好。如果不是,它会选择另一个随机子集。
我怎样才能使这种行为实际上是随机的?
我无法想象这会有用的场景,但您可以从src
和dst
中随机选择4 对点,并使用getPerspectiveTransform。除非您的点是完美的,否则您将获得每个子集的不同矩阵。
【讨论】:
“使用 RANSAC,您将拥有具有最小重投影误差的模型” - 实际上,您拥有具有最大内点数的模型,这不一定是具有最小重投影误差的模型。【参考方案2】:我以为 RANSAC 应该是随机选择一个点的子集来进行拟合,那为什么每次都返回相同的变换矩阵呢?
RANSAC重复选择点的子集,然后基于它们拟合模型,然后检查数据集中有多少数据点是给定拟合模型的内点。一旦完成了很多次,它就会选择具有最多内点的拟合模型,并将模型重新拟合到这些内点。
对于任何给定的数据集、可变模型参数集以及构成内点的规则,将存在一个或多个(但通常恰好是一个)最大可能的“内点”集。例如,给定这个数据集(图片from Wikipedia):
...那么对于异常值的某种合理定义,任何线性模型可以具有的最大可能的内部值集是下面蓝色的那个:
我们称上面的蓝点集 - 最大可能的内点集 - I。
如果您随机选择少量点(例如两个或三个)并通过它们绘制一条最适合的线,希望直观地看出它只需要您尝试几次,直到您遇到以下迭代:
你选择的所有随机点都来自我,所以 通过这些点的最佳拟合线大致等于上图中的最佳拟合线,因此 在该迭代中找到的内点集合正是 I从那次迭代开始,所有进一步的迭代都是浪费,不可能进一步改进模型(尽管 RANSAC 无法知道这一点,因为它无法神奇地知道何时找到最大的内点集)。
如果相对于数据集的大小,您有足够多的迭代次数,并且有足够大比例的数据集是内点,那么您最终会以接近 100% 的机会找到最大内点集每次运行 RANSAC。因此,RANSAC 将(几乎)总是输出完全相同的模型。
这是一件好事!通常,您希望 RANSAC 找到绝对最大的内点集合,并且不想满足于任何更少的东西。如果在这种情况下每次运行 RANSAC 都得到不同的结果,则表明您希望增加迭代次数。
(当然,在上面的例子中,我们谈论的是尝试通过二维平面中的点拟合一条线,这不是 findHomography
所做的,但原理是一样的;通常仍然会有一个最大的内点集合,最终 RANSAC 会找到它。)
我怎样才能使这种行为实际上是随机的?
减少迭代次数 (maxIters
),以便 RANSAC 有时无法找到最大内点集。
但除了纯粹的求知欲之外,通常没有理由这样做;你基本上是在故意告诉 RANSAC 输出一个劣质模型。
【讨论】:
以上是关于OpenCV RANSAC 每次都返回相同的转换的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV RANSAC 和 LMeDS 都制作了一个大小为 0 的基本矩阵
如何检索findHomography和RANSAC计算出的同分布点?
(转载)利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 置顶