Dua*_*man 6 geometry opencv computer-vision
我在理解飞机到平面单应的工作方面遇到了很多麻烦.特别是我想知道opencv方法是如何工作的.
这是光线跟踪吗?齐次坐标与尺度*向量有何不同?
我读到的所有内容都说你已经知道他们在谈论什么,所以很难掌握!
fir*_*ant 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
迭代程序最小化几何成本函数.看起来高斯-Newton方法实现: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.
Run Code Online (Sandbox Code Playgroud)
3x3矩阵中的Homography,用于绘制2D点.映射在齐次坐标中是线性的:[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通过随机试验和误差方法在多次迭代中找到正确的内点,我们需要一种非常快速的方法来计算单应性,这将是一种线性近似,可以最小化参数的误差(错误的度量),但在其他方面与最终解决方案足够接近(最小化平方点坐标残差 - 一个正确的指标).我们使用线性解决方案作为进一步非线性优化的猜测;
最后一步是使用我们的初始猜测(最小化Homography参数的线性系统的解决方案)来求解非线性方程(最小化平方像素误差的总和).例如,使用平方残差而不是绝对值的原因是因为在高斯公式(描述噪声)中我们有一个平方指数exp(x-mu)^ 2,所以(跳过一些概率公式)最大似然解需要平方残差.
为了执行非线性优化,通常采用Levenberg-Marquardt方法.但是在第一次近似中,可以使用梯度下降(请注意,梯度指向上坡,但我们正在寻找最小值,因此我们反对它,因此下面是减号).简而言之,我们经历一组迭代1..t..N在迭代t选择单应性参数为param(t)= param(t-1)-k*gradient,其中gradient = d_cost/d_param.
奖励材料:为了进一步减少单应性中的噪音,您可以尝试一些技巧:减少点的搜索空间(开始跟踪您的点数); 使用不同的特征(线条,圆锥等,也可以通过单应性转换但可能具有更高的SNR); 拒绝不可能的同形异义词来加速RANSAC(例如那些对应于'不可能'点移动的那些); 使用低通滤波器来处理可能归因于噪声的Homographies中的微小变化.
| 归档时间: |
|
| 查看次数: |
9626 次 |
| 最近记录: |