- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 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/
我有一个标记,我想对其应用单应变换。例如,我有一张带有自己框架的图像,我想做的是围绕 X 轴旋转图像。 我可以使用 warpPerspective 但我需要那个矩阵(单应性)来进行特定的变换(例如 3
我正在 Visual Studio 2010 上使用 OpenCV 2.3.1 进行图像拼接项目。 我目前有 2 个问题。 (我的声望不超过10所以我在这个帖子里只能发2个超链接,我会在评论区再发2个
众所周知,在 OpenCV 中,我可以在 2 个图像之间进行仿射或透视变换: M - affine transformation - 通过使用 estimateRigidTransform() H -
我已经按照 python 中的 opencv 教程进行操作。我正在使用 OpenCV 3.2 和 Python 3.6.1。代码是这样写的: import cv2 import numpy as np
我有一个字段中的点列表(如 upper_goal_point/left_upper_outer_corner 等) 我知道它们在目标图像中的对应坐标 - 所以我可以计算单应性: h, status =
我在射影空间中有一组 3D 点,我想将它们转换为公制 3D 空间,以便我可以以米为单位测量距离。 为此,我需要一个 3D 到 3D 单应矩阵,它是一个具有 15 个自由度的 4x4 矩阵(因此我需要
我是一名优秀的程序员,十分优秀!