Matlab中基本矩阵的不同结果

Posted

技术标签:

【中文标题】Matlab中基本矩阵的不同结果【英文标题】:Different results for Fundamental Matrix in Matlab 【发布时间】:2014-03-01 03:16:11 【问题描述】:

我正在实现立体匹配,并且作为预处理,我正在尝试在没有相机校准的情况下校正图像。 我正在使用冲浪检测器来检测和匹配图像上的特征并尝试对齐它们。找到所有匹配项后,我使用此函数删除所有不在核线上的内容:

[fMatrix, epipolarInliers, status] = estimateFundamentalMatrix(...
  matchedPoints1, matchedPoints2, 'Method', 'RANSAC', ...
  'NumTrials', 10000, 'DistanceThreshold', 0.1, 'Confidence', 99.99);

inlierPoints1 = matchedPoints1(epipolarInliers, :);
inlierPoints2 = matchedPoints2(epipolarInliers, :);

figure; showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2);
legend('Inlier points in I1', 'Inlier points in I2');

问题是,如果我使用相同的数据运行此函数,我仍然会得到不同的结果,从而导致每次运行相同数据时产生的视差图存在差异 完全匹配的点仍然相同,但每次运行中的内联点都不同。 在这里你可以看到一些匹配的结果不同:

更新:我认为差异是由 RANSAC 方法引起的,但是使用 LMedS、MSAC,我仍然在相同的数据上得到不同的结果

【问题讨论】:

【参考方案1】:

编辑:诚然,这只是部分答案,因为我只是在解释为什么使用这些拟合方法甚至可能实现这一点,而不是如何改进输入关键点以从一开始就避免这个问题。正如其他答案中所述,您的关键点匹配的分布存在问题,在关键点检测阶段有一些方法可以解决这个问题。但是,相同的输入可以产生不同的结果重复执行estimateFundamentalMatrix相同的关键点对是因为以下. (同样,这并没有为改进关键点以解决这个问题提供合理的建议)。

重复执行结果不同的原因,与RANSAC方法(以及LMedS和MSAC)有关。它们都使用随机(随机)采样,因此是非确定性的。除了Norm8Point之外的所有方法都通过一次随机采样8对点来操作(最多)NumTrials

但首先,请注意,对于相同输入获得的不同结果并不同样合适(它们不会有相同的残差),但搜索空间很容易导致任何这样的最小值,因为优化算法不是确定性的。正如其他答案正确建议的那样,改进您的关键点,这不会成为问题,但这就是为什么稳健的拟合方法可以做到这一点以及一些修改其行为的方法。

请注意'NumTrials' 选项的文档(添加注意:更改它不是解决方案,但这确实解释了行为):

'NumTrials' — 发现异常值的随机试验次数 500(默认)|整数

用于查找异常值的随机试验次数,指定为逗号分隔的对组,由 'NumTrials' 和一个整数值组成。 当您将 Method 参数设置为 LMedS、RANSAC、MSAC 或 LTS 时,此参数适用。

MSAC (M-estimator SAmple Consensus) 是修改后的 RANSAC (RANdom SAmple Consensus)。 LMedS 的确定性算法具有指数复杂度,因此实际上需要随机抽样。

在您决定使用Norm8Point(同样,不是解决方案)之前,请记住,此方法假定没有异常值,因此对于错误匹配不可靠。尝试使用更多试验来稳定其他方法(编辑:我的意思是,而不是切换到 Norm8Point,但如果你能够在你的算法中备份,那么将输入 - 关键点 - 作为第一行攻击)。此外,要重置随机数生成器,您可以在每次调用 estimateFundamentalMatrix 之前执行 rng('default')。但同样请注意,虽然这会强制每次运行都给出相同的答案,但总体而言,改善关键点分布是更好的解决方案。

【讨论】:

那么有什么方法可以使它具有确定性吗? 如果您有计算能力来使用所有点而不是一次随机采样 8 对点,请使用 Norm8Point 方法。然而,这种方法假设没有异常值,因此对错误匹配不鲁棒!也许如果您使用更多试验其他方法会稳定? 有一种很傻的方式,特别是在C++中,但是你需要修改源代码。给定相同的种子,伪随机生成器总是给出相同的序列。所以你初始化随机生成器不是用随机数,而是用一个预定义的数字。 @old-ufo 好点。如果生成器是系统范围的生成器,您可以在每次运行之前执行rnd('default') @MartinCh 默认是种子 0 的 Mersenne Twister,这很好。不要试图通过改变生成器来获得更好的结果,而是通过增加'NumTrials'。要重置生成器,只需在每次调用estimateFundamentalMatrix 之前执行rnd('default')。函数estimateFundamentalMatrix>generateRandomIndices 使用系统范围的生成器,所以这应该可以工作。【参考方案2】:

我知道您的回答为时已晚,但我想这对将来的某人有用。实际上,您的情况有两个问题,

特征的退化位置,即特征的位置主要是局部的(在你身上:P),并且没有很好地分布在整个图像中。

这些比赛有点像在同一平面上。我知道你会争辩说你的身体不是平面的,但将它与房间的深度相比,它有点。

从数学上讲,这意味着您有点像从一个平面中提取 E(或 F),它总是有无限的解。为了解决这个问题,我建议对任何两个提取的 SURF 特征之间的距离进行一些限制,即用于匹配的任何两个 SURF 特征应该至少相距 40 或 100 像素(取决于图像的分辨率)。

【讨论】:

@jhegedus 这与答案的不确定性有什么关系?相同的输入没有产生相同的输出是因为随机抽样。结果不稳定是一个不同的问题,在这个程度上这个答案很有用,但它不会改变你仍然可以得到不同的关键点匹配的事实。 OP没有意识到这一点。请评论为什么我的答案不正确。问题不是“我如何充分利用关键点匹配”,而是为什么每次相同的数据都会得到不同的结果。 是的,多个有效答案的存在使得稳健拟合方法能够收敛于不同的解决方案,但在使用相同输入的重复运行时甚至会发生这种情况的原因是随机抽样。回答中的建议有助于理解为什么这个特定问题不稳定,我完全同意。 OP 需要了解这两个问题,但想知道为什么 estimateFundamentalMatrix 是不确定的。 嗯,很明显,由于 RANSAC 的随机性,存在差异。不明显的是这些差异为何以及何时显着。正如 OP 所说,“我认为差异是由 RANSAC 引起的”,因为他知道 RANSAC 是随机的。每个人都知道,谁知道首字母缩略词代表什么。因此,问题不是要解释 RANSAC 是随机的,而是要解释为什么差异很大。确实是一个非常难以回答的问题! @chappjc 我想让 Martin 了解这个问题背后的原因,并且只更改“numTrials”参数不会影响答案,只要使用一些自适应非最大抑制技术。其他建议的答案忽略了这个非常重要的考虑因素,因此,我想将它提请未来的读者注意。 @jhegedus 如果您阅读了该引文的其余部分,OP 显然不知道 LMedS 和 MSAC 也以这种方式工作。郑重声明,从一般理解的角度来看,我确实认为这个答案比我的要好,但我不认为我的误导性太大以至于需要投反对票……仅此而已。【参考方案3】:

获得更好的 SURF 功能的另一种方法是将detectSURFFeatures(rgb2gray(I1),'NumOctaves',5); 中的“NumOctaves”设置为更大的值。

我面临同样的问题,这有帮助(一点点)。

【讨论】:

很好的建议,但我要指出,无论您如何调整特征检测器和提取器,最终视频流中的错误场景(可能是不可能的)可能会出现并产生问题。在这种情况下,可能仍然需要确保可重复的结果......对于任何使用随机抽样的方法来说都是一个挑战:)以及我如何解释这个问题。 +1 尽管如此。我希望我原来的答案不会太误导。干杯。

以上是关于Matlab中基本矩阵的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

fft2 (matlab) 和 fftw (C) 的不同结果

MATLAB:在矩阵中插入不同数量的 NaN

MATLAB以不同方式随机排列列

matlab中怎样计算一个矩阵中每个数的平方?

matlab中如何计算二维数组大小?

Matlab练习——rpy2tr函数与自己实现的ZYX欧拉角的结果不同的问题