opencv - 如何提高单应性精度?

标签 opencv computer-vision

我使用 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/

相关文章:

opencv - 矩形空白区域检测 (OpenCV)

opencv - 选择哪种算法进行目标检测?

opencv - 如何使用openCV确定平移和旋转矩阵

c++ - 通过鱼眼畸变功能扭曲直线并在图像中正确绘制

c++ - 对图像中的一系列颜色进行阈值处理

c# - 用于原始拜耳相机的 EmguCV 视频捕获

python - 连接多个 USB 摄像头

python - 什么是衡量训练表现的良好学习率图

c++ - OpenCV calibrateCamera 断言失败(ni == ni1)

python - 将 cv2.umat 转换为 numpy 数组