18

我使用 OpenCV 的cv::findHomographyAPI 来计算两个平面图像的单应矩阵。匹配的关键点由 SIFT 提取并由 BFMatcher 匹配。据我所知,cv:findHomography使用RANSAC迭代找出最好的四个对应点来得到单应矩阵。因此,我使用对象边缘的同质矩阵绘制具有计算轮廓的选定四对点。结果如链接:

https://postimg.cc/image/5igwvfrx9/

我们可以看到,RANSAC选择的匹配点是正确的,但是轮廓显示单应性不准确。

但是这些测试表明,选择的匹配点和单应性都是正确的:

https://postimg.cc/image/dvjnvtm53/

我的猜测是,如果选择的匹配点太接近,像素位置的小误差会导致单应矩阵的显着误差。如果这四个点在图像的角落,那么匹配的点移动4-6个像素仍然得到很好的单应矩阵。(根据齐次坐标,我认为是合理的,因为近平面的小误差会在远处放大)

我的问题是:

1.我猜对了吗?2.由于四个匹配点是由RANSAC迭代产生的,所有关键点的整体误差最小。但是如何获得稳定的单应性,至少使轮廓的映射是正确的?理论证明,如果找到一个平面内的四个对应点,就应该计算出单应矩阵,但是工程师工作有什么窍门吗?

4

3 回答 3

10

我认为你是对的, 4 个点的接近度无助于结果的准确性。您观察到的结果可能是由数值问题引起的:对于这 4 个点,结果可能在局部是正确的,但在进一步发展时会变得更糟。

但是,RANSAC 不会在这里为您提供帮助。原因很简单:RANSAC 是一种稳健的估计程序,旨在在许多对应关系(包括一些错误的对应关系)中找到最佳点对。然后,在 RANSAC 的内部循环中,执行标准的单应性估计。

您可以将RANSAC视为一种拒绝会导致不良结果的错误点对应的方法。

回到你的问题:

您真正需要的是获得更多积分。在您的示例中,您仅使用 4 点对应关系,这足以估计单应性。您将通过在整个目标图像中提供更多匹配来改善您的结果。然后问题变得过度确定,但 OpenCV 仍然可以找到最小二乘解决方案。此外,在点对应过程或某些点定位中存在一些错误,RANSAC 将能够选择最好的,并且仍然给你一个可靠的结果。

如果 RANSAC 导致在某些 4 个点上过度拟合(在您的示例中似乎就是这种情况),请尝试通过增加ransacReprojThreshold参数来放松约束。或者,您可以:

  • 使用不同的估计器(CV_LMEDS如果匹配错误很少,稳健的中位数是一个不错的选择)
  • 或在第一步中使用具有较大重投影误差(以获得粗略估计)的 RANSAC 以检测虚假匹配,然后在正确匹配上使用 LMEDS。
于 2013-09-26T06:46:07.613 回答
6

只是为了扩展@sansuiso的答案,我同意:

如果您向 RANSAC 提供大约 100 封信函,您可能会从cvFindHomography. 检查status输出参数。要获得良好的单应性,您应该有超过 4 个对应关系(请注意,4 个对应关系总是会给您一个单应性),它们在图像周围分布良好,并且不是线性的。您实际上可以使用最小数量的内点来确定获得的单应性是否足够好。

请注意,RANSAC 会找到一组一致的点,但它必须说该组是最好的点(重投影误差)的方式有点有限。有一种类似于 RANSAC 的方法,称为 MSAC,它使用稍微不同的误差测量,检查一下。

以我的经验,坏消息是,在大多数情况下,它几乎不可能获得 100% 精度的单应性。如果您有几个相似的帧,您可能会看到它们之间的单应性略有变化。

有一些技巧可以改善这一点。例如,使用 RANSAC 获得单应性后,您可以使用它将您的模型投影到图像中,并寻找新的对应关系,这样您就可以找到另一个应该更准确的单应性。

于 2013-09-26T09:14:07.677 回答
1

你的目标有很多对称和相似的元素。正如其他人提到的(你稍后澄清)点间距和点数可能是一个问题。另一个问题是 SIFT 并非旨在处理您的案例中存在的重大透视扭曲。尝试通过较小的旋转来跟踪您的对象,如前所述,使用最新的单应性重新投影它,使其看起来尽可能接近原始对象。这也将允许您跳过处理繁重的 SIFT,并使用像 FAST 这样轻量级的东西以及图像块的互相关进行匹配。

您也可能最终会理解使用积分是不够的。你必须使用你所拥有的一切,这意味着线条或圆锥曲线。如果单应性变换点 Pb = H* Pa 很容易验证在齐次坐标中线 Lb = Hev.transposed * La。这直接来自等式 La'.Pa = 0 = La' * Hinv * H * Pa = La' * Hinv * Pb = Lb'.Pb 可能的最小值。配置为 1 线和 3 点或 3 线和 1 点。两条线和两点不起作用。您也可以使用四条线或四个点。当然,这意味着您不能再使用 openCV 功能,必须编写自己的 DLT,然后进行非线性优化。

于 2014-02-21T08:06:02.240 回答