我很难理解平面到平面单应性的工作原理。特别是我想知道 opencv 方法是如何工作的。
和光线追踪一样吗?齐次坐标与比例*矢量有何不同?
我读到的所有内容都像你一样已经知道他们在说什么,所以很难掌握!
我很难理解平面到平面单应性的工作原理。特别是我想知道 opencv 方法是如何工作的。
和光线追踪一样吗?齐次坐标与比例*矢量有何不同?
我读到的所有内容都像你一样已经知道他们在说什么,所以很难掌握!
谷歌搜索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
一个迭代过程最小化几何成本函数。似乎高斯- 牛顿法实现:
http ://en.wikipedia.org/wiki/Gauss%E2%80%93Newton_algorithm
以上所有讨论都假设您在两个图像之间存在对应关系。如果某些点与另一张图像中的错误点匹配,那么您就有异常值,并且上述方法的结果将完全错误。稳健(针对异常值)方法进入此处。OpenCV 为您提供两种选择:1.RANSAC 2.LMeDS。谷歌是你的朋友。
希望有帮助。
要回答您的问题,我们需要解决 4 个不同的问题:
1. Define homography.
2. See what happens when noise or outliers are present.
3. Find an approximate solution.
4. Refine it.
映射二维点的 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)
您可以看到在笛卡尔坐标中映射是非线性的,但现在请记住这一点。
我们可以使用最小二乘线性代数方法(参见 DLT - 直接线性变换)轻松求解齐次坐标中的前一组线性方程,但不幸的是,这只会最小化单应性参数中的代数误差。人们更关心另一种误差——即在笛卡尔坐标系中移动点的误差。如果没有噪音并且没有异常值,则两个错误可能是相同的。然而,噪声的存在要求我们最小化笛卡尔坐标中的残差(残差只是笛卡尔方程左右两侧的平方差)。最重要的是,异常值的存在要求我们使用稳健的方法,例如 RANSAC。它选择最好的内点集并拒绝一些异常值,以确保它们不会污染我们的解决方案。
由于 RANSAC 在多次迭代中通过随机试验和错误方法找到正确的内点,我们需要一种非常快速的方法来计算单应性,这将是一种线性近似,可以最大限度地减少参数的误差(错误的度量),但在其他方面足够接近最终解决方案(即最小化平方点坐标残差 - 一个正确的指标)。我们使用线性解作为进一步非线性优化的猜测;
最后一步是使用我们的初始猜测(最小化单应性参数的线性系统解)求解非线性方程(最小化像素误差平方和)。例如,使用平方残差而不是它们的绝对值的原因是因为在高斯公式(描述噪声)中我们有一个平方指数 exp(x-mu)^2,所以(跳过一些概率公式)最大似然解需要平方残差。
为了执行非线性优化,通常采用 Levenberg-Marquardt 方法。但是在第一个近似值中,可以只使用梯度下降(请注意,梯度指向上坡,但我们正在寻找最小值,因此我们反对它,因此下面有一个减号)。简而言之,我们经历了一组迭代 1..t..N,在迭代 t 处选择单应性参数为 param(t) = param(t-1) - k * gradient,其中梯度 = d_cost/d_param。
奖励材料:为了进一步减少单应性中的噪音,您可以尝试一些技巧:减少点的搜索空间(开始跟踪您的点);使用不同的特征(线、圆锥曲线等也通过单应性变换但可能具有更高的信噪比);拒绝不可能的同形异义词以加速 RANSAC(例如那些对应于“不可能”点移动的同形异义词);对可能归因于噪声的 Homographies 的微小变化使用低通滤波器。