我使用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
中位数是一个不错的选择)
关于opencv - 如何提高单应性精度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19019726/