Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 单应如何计算?_Opencv_Geometry_Computer Vision - Fatal编程技术网

Opencv 单应如何计算?

Opencv 单应如何计算?,opencv,geometry,computer-vision,Opencv,Geometry,Computer Vision,我在理解平面对平面单应性的工作原理方面遇到了不少困难。我特别想知道opencv方法是如何工作的 它像光线追踪吗?齐次坐标与比例矢量有何不同 我读到的所有东西都像你已经知道他们在说什么一样,所以很难理解 googlehomography estimation将此作为第一个链接返回(至少对我来说): . 当然,这是一个糟糕的描述,很多地方被忽略了。如果你想学习这些概念,读一本好书比读一些短文要好得多。这些短文经常会有几个严重的错误,所以要小心 简言之,我们定义了一个代价函数,使这个代价函数最小化的参

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

它像光线追踪吗?齐次坐标与比例矢量有何不同


我读到的所有东西都像你已经知道他们在说什么一样,所以很难理解

google
homography estimation
将此作为第一个链接返回(至少对我来说): . 当然,这是一个糟糕的描述,很多地方被忽略了。如果你想学习这些概念,读一本好书比读一些短文要好得多。这些短文经常会有几个严重的错误,所以要小心

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

如果您想知道OpenCV中使用的方法,只需查看代码: 这是代数函数DLT,在提到的书中定义,如果你在谷歌上搜索单应DLT,你应该能找到一些相关的文档。然后这里: 一个迭代过程使几何代价函数最小化。高斯-牛顿法似乎已实现:

以上所有讨论都假设两个图像之间存在对应关系。如果某些点与另一幅图像中的不正确点匹配,则会得到异常值,并且上述方法的结果将完全不正确。鲁棒(针对异常值)方法在此处输入。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.

  • 映射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)

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

  • 我们可以使用最小二乘线性代数方法(参见DLT-直接线性变换)轻松地在齐次坐标系中求解前一组线性方程组,但不幸的是,这只能最小化单应参数中的代数误差。人们更关心另一种误差,即在笛卡尔坐标系中移动点的误差。如果没有噪声和异常值,两个误差可能是相同的。然而,噪声的存在要求我们最小化笛卡尔坐标系中的残差(残差只是笛卡尔方程左右两侧的平方差)。除此之外,异常值的存在要求我们使用稳健的方法,如RANSAC。它选择最佳的内联线集,并拒绝一些异常值,以确保它们不会污染我们的解决方案

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

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

  • 为了执行非线性优化,通常采用Levenberg-Marquardt方法。但在一级近似中,可以使用梯度下降法(注意,梯度点向上,但我们正在寻找一个最小值,因此我们反对它,因此下面有一个减号)简言之,我们经过一组迭代1..t..N,在迭代t中选择单应参数作为param(t)=param(t-1)-k*梯度,其中梯度=d_成本/d_参数

    额外材料:为了进一步降低单应性中的噪声,您可以尝试一些技巧:减少点的搜索空间(开始跟踪点);使用不同的特征(直线、二次曲线等)