如何计算单应性?

时间:2012-05-04 00:18:36

标签: opencv geometry computer-vision

我在理解飞机与平面单应的运作方面遇到了很多麻烦。特别是我想知道opencv方法是如何工作的。

是否像光线追踪?齐次坐标与尺度*向量有何不同?

我读到的所有内容都说你已经知道他们在谈论什么,所以很难掌握!

2 个答案:

答案 0 :(得分:14)

谷歌搜索homography estimation将此作为第一个链接返回(至少对我而言): http://cseweb.ucsd.edu/classes/wi07/cse252a/homography_estimation/homography_estimation.pdf。这绝对是一个糟糕的描述,并且已经省略了很多。如果你想学习这些概念,阅读像Multiple View Geometry in Computer Vision这样的好书比阅读一些短文更好。这些短文通常有几个严重的错误,所以要小心。

简而言之,定义了成本函数,并且最小化此成本函数的参数(单应矩阵的元素)是我们正在寻找的答案。有意义的成本函数是几何的,也就是说,它具有几何解释。对于单应性情况,我们希望找到H,使得通过将点从一个图像变换到另一个图像,所有点之间的距离和它们的对应关系最小。这个几何函数是非线性的,这意味着:1 - 应该使用迭代方法来解决它,通常,2 - 迭代方法需要一个初始起点。在这里,代数成本函数进入。这些成本函数没有有意义/几何解释。通常设计它们更像是一门艺术,对于一个问题,通常你可以找到几个具有不同属性的代数成本函数。代数成本的好处在于它们导致线性优化问题,因此存在一种封闭形式的解决方案(即一次性/非迭代式方法)。但缺点是找到的解决方案不是最佳的。因此,一般方法是首先优化代数成本,然后使用找到的解作为迭代几何优化的起点。现在,如果你谷歌搜索单应性的这些成本函数,你会发现它们通常是如何定义的。

如果您想知道OpenCV中使用的方法,只需要查看代码: http://code.opencv.org/projects/opencv/repository/entry/trunk/opencv/modules/calib3d/src/fundam.cpp#L81 这是代数函数,DLT,在上述书中定义,如果你的谷歌homography DLT应该找到一些相关的文件。然后在这里: http://code.opencv.org/projects/opencv/repository/entry/trunk/opencv/modules/calib3d/src/fundam.cpp#L165 迭代过程最小化几何成本函数。似乎实现了Gauss-Newton方法: http://en.wikipedia.org/wiki/Gauss%E2%80%93Newton_algorithm

以上讨论假设您在两张图片之间存在对应关系。如果某些点与另一个图像中的错误点匹配,那么您将获得异常值,并且所提到的方法的结果将完全关闭。强大(针对异常值)方法进入此处。 OpenCV为您提供两种选择:1.RANSAC 2.LMeDS。谷歌是你的朋友。

希望有所帮助。

答案 1 :(得分:5)

要回答您的问题,我们需要解决4个不同的问题:

1. Define homography.
2. See what happens when noise or outliers are present.
3. Find an approximate solution.
4. Refine it.

  1. 用于绘制2D点的3x3矩阵中的Homography。映射在齐次坐标中是线性的:[x2,y2,1]'~H * [x1,y1,1]',其中'表示转置(将列向量写为行),〜表示映射符合规模。在笛卡尔坐标系中更容易看到(用同一因子乘以分母和分母不会改变结果)

    x2 =(h11 * x1 + h12 * y1 + h13)/(h31 * x1 + h32 * y1 + h33)

    y2 =(h21 * x1 + h22 * y1 + h23)/(h31 * x1 + h32 * y1 + h33)

    你可以看到,在笛卡尔坐标系中,映射是非线性的,但现在请记住这一点。

  2. 我们可以使用最小二乘线性代数方法(参见DLT - 直线变换)轻松地求解均匀坐标中的前一组线性方程,但不幸的是,这只能最小化单应性参数中的代数误差。人们更关心另一种错误 - 即在笛卡尔坐标系中转移点的错误。如果没有噪音且没有异常值,则两个错误可以相同。然而,噪声的存在要求我们最小化笛卡尔坐标中的残差(残差是笛卡尔方程左右两侧之间的平方差)。最重要的是,异常值的存在要求我们使用鲁棒方法,如RANSAC。它选择最好的内点并拒绝一些异常值,以确保它们不会污染我们的解决方案。

  3. 由于RANSAC通过随机试错法在多次迭代中找到正确的内点,我们需要一种非常快速的方法来计算单应性,这将是一种线性近似,可以最大限度地减少参数的误差(错误的指标),但在其他方面足够接近到最终的解决方案(最小化平方点坐标残差 - 一个正确的指标)。我们使用线性解决方案作为进一步非线性优化的猜测;

  4. 最后一步是使用我们的初始猜测(最小化Homography参数的线性系统的解决方案)来求解非线性方程(最小化平方像素误差的总和)。例如,使用平方残差而不是绝对值的原因是因为在高斯公式(描述噪声)中我们有一个平方指数exp(x-mu)^ 2,所以(跳过一些概率公式)最大似然解需要平方残差。

  5. 为了执行非线性优化,通常采用Levenberg-Marquardt方法。但是在第一次近似中,可以使用梯度下降(请注意,梯度指向上坡但我们正在寻找最小值,因此我们反对它,因此下面是减号)。简而言之,我们经历了一组迭代1..t..N在迭代t选择单应性参数为param(t)= param(t-1) - k * gradient,其中gradient = d_cost / d_param。

    奖励材料:为了进一步减少单应性中的噪音,您可以尝试一些技巧:减少搜索空间以获得积分(开始追踪您的积分);使用不同的特征(线条,圆锥等,也可以通过单应性转换,但可能具有更高的SNR);拒绝不可能的同形异义词以加速RANSAC(例如那些对应于'不可能'点移动的那些);使用低通滤波器来处理可能归因于噪声的Homographies中的微小变化。