我使用OpenCV的cv::findHomography API计算两个平面图像的单应性矩阵。
匹配的关键点通过SIFT提取,并通过BFMatcher匹配。据我所知,cv:findHomography使用RANSAC迭代来找出最佳的四个对应点,以获得单应性矩阵。
因此,我使用对象边缘的均匀矩阵绘制了选定的四对点,并计算出轮廓。
结果如下所示:

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

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

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

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

我的猜测是,如果所选的匹配点太近,像素位置的小误差将导致单应性矩阵的显着误差。如果四个点位于图像的一角,则匹配点的偏移量为4-6个像素,仍然可以获得良好的单应性矩阵。
(根据同质坐标,我认为这是合理的,因为近平面中的小误差将在远处放大)

我的问题是:

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

最佳答案

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

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

您可以看到 RANSAC 作为拒绝错误点对应关系
方法,这会招致不好的结果。

返回您的问题:

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

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

  • 使用不同的估算器(如果匹配错误很少,则健壮的CV_LMEDS中位数是一个不错的选择)
  • 或第一步,使用具有较大重投影误差的RANSAC(以获得粗略估计)以检测虚假匹配,然后对正确的匹配使用LMEDS。
  • 关于opencv - 如何提高单应性精度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19019726/

    10-12 22:06