如何计算单应矩阵?

6

我在理解平面到平面单应性方面遇到了一些困难。特别是我想知道opencv方法的工作原理。

它是否类似于光线追踪?齐次坐标与比例*向量有何不同?

我读到的所有内容都像你已经知道他们在说什么,所以很难理解!


可能是一个重复问题:OpenCV单应性,转换点,这段代码在做什么? - paulsm4
2个回答

16

我搜索 单应矩阵估计,第一个链接是这个(至少对我来说):http://cseweb.ucsd.edu/classes/wi07/cse252a/homography_estimation/homography_estimation.pdf。但是这篇文章描述不够详细,省略了很多内容。如果你想学习这些概念,阅读一本好书如计算机视觉中的多视角几何会比阅读一些简短文章更好。通常这些简短文章有严重的错误,所以要小心。

简而言之,成本函数被定义,并且最小化这个成本函数的参数(单应性矩阵的元素)就是我们要找的答案。一个有意义的成本函数是几何的,也就是说,它有一个几何解释。对于单应性情况,我们想要找到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 迭代过程最小化几何成本函数。它似乎使用了高斯牛顿法: http://en.wikipedia.org/wiki/Gauss%E2%80%93Newton_algorithm 以上讨论都假设您有两张图像之间的对应关系。如果某些点与另一张图像中的错误点匹配,则您将得到离群值,而所提到的方法的结果将完全失效。鲁棒(抵抗离群值)方法在这里进入。OpenCV为您提供了两个选项:1.RANSAC 2.LMeDS。谷歌是您的好朋友。

希望这可以帮助您。


6
为了回答你的问题,我们需要回答四个不同的问题:
1. Define homography.
2. See what happens when noise or outliers are present.
3. Find an approximate solution.
4. Refine it.

  1. Homography是一个将2D点映射到3x3矩阵的线性变换。在齐次坐标系下,映射是线性的:[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-Direct Linear Transform),但不幸的是,这仅最小化了单个代数误差。人们更关心另一种类型的误差-即在笛卡尔坐标系统中移动点的误差。如果没有噪声和异常值,两种错误可能是相同的。然而,噪声的存在要求我们最小化笛卡尔坐标系中的残差(残差只是笛卡尔方程左右两侧的平方差)。此外,异常值的存在要求我们使用RANSAC等鲁棒方法。它选择最佳的内点集并拒绝一些异常值,以确保它们不会污染我们的解决方案。

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

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

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

奖励材料:为了进一步减少同态图像中的噪声,您可以尝试一些技巧:减少点的搜索空间(开始跟踪您的点);使用不同的特征(线,圆等也被同态图像转换但可能具有更高的信噪比);拒绝不可能的同态图像以加速RANSAC(例如,那些对应于“不可能”的点移动);对于可能归因于噪声的同态图像中的小变化使用低通滤波器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接