4

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

[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,我仍然在相同的数据上得到不同的结果

4

3 回答 3

4

编辑:诚然,这只是部分答案,因为我只是在解释为什么使用这些拟合方法甚至可以实现这一点,而不是如何改进输入关键点以从一开始就避免这个问题。正如其他答案中所述,您的关键点匹配的分布存在问题,并且有一些方法可以在关键点检测阶段解决该问题。但是,对于相同的关键点对的重复执行,相同的输入可能会产生不同的结果,原因如下。(同样,这并没有为改进关键点以解决这个问题提供合理的建议)。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,但如果您能够在您的算法中备份,那么将输入 - 关键点 - 作为第一道攻击线)。此外,要重置随机数生成器,您可以rng('default')在每次调用estimateFundamentalMatrix. 但同样,请注意,虽然这将强制每次运行相同的答案,但改善关键点分布通常是更好的解决方案。

于 2014-02-04T23:05:13.217 回答
3

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

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

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

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

于 2014-09-14T13:03:24.903 回答
2

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

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

于 2015-03-14T08:11:50.743 回答