【问题标题】:Finding Homography And Warping Perspective寻找单应性和翘曲视角
【发布时间】:2011-11-18 11:43:26
【问题描述】:

使用 FeatureDetector,我可以在两个具有相同元素的图像上获得特征,并将这些特征与 BruteForceMatcher 相匹配。 然后我使用 OpenCv 函数 findHomography 来获取单应矩阵

H = findHomography( src2Dfeatures, dst2Dfeatures, outlierMask, RANSAC, 3);

并得到H矩阵,然后将图像与

对齐
warpPerspective(img1,alignedSrcImage,H,img2.size(),INTER_LINEAR,BORDER_CONSTANT);

我需要知道被检测元素的旋转角度、比例、位移。有没有比一些大方程式更简单的方法来得到这个?一些评估公式只是为了放入数据?

【问题讨论】:

    标签: image-processing opencv computer-vision


    【解决方案1】:

    如果相机经过纯旋转或缩放且没有平移,则单应性将匹配位于平面上或任意 3D 中的元素的投影。因此,这里是我们正在讨论的案例,表明我们计算的输入是什么:
    - 平面目标、纯旋转、帧内单应性
    - 平面目标、旋转和平移、目标到帧单应性
    - 3D 目标、纯旋转、帧到帧映射(受基本矩阵约束)

    在平面目标的情况下,通过帧到帧单应性 (H12) 可以轻松计算纯旋转: 给定固有相机矩阵 A,帧 H1 和 H2 的平面到图像单应性可以表示为 H1=A, H2=A*R, H12 = H2*H1-1=ARA-1 因此 R=A-1H12*A

    在元素位于平面上的情况下,可以通过分解目标到帧的单应性来计算相机平移的旋转(直到未知比例)。请注意,目标可以只是其中一个视图。假设您将原始平面目标作为图像(在某个参考方向拍摄),您的任务是分解图像 H12 之间的单应性,这可以通过 SVD 完成。 H 的前两列表示旋转矩阵的前两列,可以通过 H=ULVT, [r1 r2] = UDVT 恢复,其中 D 为 3x2最后一行全为 0 的单位矩阵。旋转矩阵的第三列只是前两列的向量积。 Homography 的最后一列是平移向量乘以某个常数。

    最后对于 3D 和纯相机旋转中点的任意配置,使用基本矩阵分解而不是单应性来计算旋转,请参阅this

    【讨论】:

    • "[r1 r2] = UDV^T 其中 D 是 3x2 单位矩阵,最后一行全为 0",U,V 是 3x3 矩阵,D 怎么可能是 3x2 矩阵?
    • SVD 分解作用于非方阵,而不是需要方阵的特征值分解。你把V的尺寸弄错了。它们是 mxn = mxm * mxn * nxn
    • 感谢您的回答,但我仍然很困惑,因为 H 是一个 3x3 矩阵,并且将 SVD 应用于 H,说 [U,S,V] = svd(H),将产生 3x3矩阵 U、S 和 V。你能更准确地解释一下吗?谢谢!
    • H的前两列代表旋转矩阵的前两列...
    【解决方案2】:
    cv::decomposeProjectionMatrix();
    

    cv::RQDecomp3x3();
    

    两者都与您想要实现的目标相似。

    没有一个是完美的。它们背后的理论以及为什么不能从 3x3 矩阵中提取所有参数有点麻烦。但简短的回答是,3x3 proj 矩阵是完整的 4x4 矩阵的简化,基于所有点都位于同一平面上的事实。

    【讨论】:

    • 我的例子中的所有点都在同一个平面上,因为我使用的是平面元素,只有旋转、位移和比例变化。在 decomposeProjectionMatrix 中只能得到位移向量和旋转矩阵,如何获取比例?
    • 比例取决于相机的内在参数(焦距,视野),但我不知道任何简单或通用的方法来提取它。
    • 对不起,我还是不明白。对于 H = [225,225,112;154,175,175; 208,63,171] 得到 R = [159,53,91;6,49,63;233,63,112] 和正交矩阵 = [243,71,56;60,212,16;,214,63,150] 如何获得旋转角度和显示 x,y。 opencv warpPerspective 如何评估规模?
    • :) 欢迎来到 3D 世界。这很麻烦且难以理解。如果您仍然想在这里获得它,这是一个不错的帖子。但不要指望半天就能拥有一切。可能需要数周的工作、数学和黑客技术才能理解它。 stackoverflow.com/questions/6606891/…
    • cv::RQDecomp3x3() 仅返回旋转。如果涉及平移,则必须使用单应性的 SVD 来恢复旋转矩阵的前两列,并找到第三列作为它们的向量积。按比例缩放的翻译是单应性的最后一列。
    【解决方案3】:

    您可以尝试使用 levenberg marquardt 优化,其中参数将是平移和旋转,方程将通过计算出的两个图像的特征之间的距离来表示(仅使用来自 ransac 单应性的内点)。 这是LM http://www.ics.forth.gr/~lourakis/levmar/的C++实现@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-28
      • 2018-04-02
      • 2012-10-13
      • 2015-01-10
      • 1970-01-01
      • 2015-12-10
      • 2015-01-23
      • 2016-10-18
      相关资源
      最近更新 更多