Matlab中基本矩阵的不同结果

时间:2014-02-04 22:10:08

标签: matlab feature-detection surf matlab-cvst disparity-mapping

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

[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');

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

Inliner Points

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

3 个答案:

答案 0 :(得分:4)

编辑:不可否认,这只是一个部分答案,因为我只是解释了为什么使用这些拟合方法甚至可以实现这一点,而不是如何从一开始就改善输入关键点以避免这个问题。如其他答案中所述,关键点匹配的分布存在问题,并且有一些方法可以在关键点检测阶段解决 。但是,相同的输入可以产生不同的结果,因为{strong>相同的关键点重复执行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。但同样请注意,虽然这会在每次运行时强制执行相同的答案,但改善关键点分布通常是更好的解决方案。

答案 1 :(得分:3)

我知道你的答案为时已晚,但我想这对未来的某些人有用。实际上,你的案子中的问题有两个,

  • 要素的退化位置,即要素的位置主要是本地化的(在你身上:P)并且在整个图像中没有很好地传播。

  • 这些匹配在同一平面上。我知道你会争辩说你的身体不是平面的,但是将它与房间的深度相比较,就是这样。

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

答案 2 :(得分:2)

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

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