【问题标题】:rotation and translation matrix from homography opencv来自单应性opencv的旋转和平移矩阵
【发布时间】:2018-09-17 17:46:10
【问题描述】:

我正在用java开发一个android应用程序,我使用findHomography()用opencv计算了单应性,我如何通过单应性找到包含旋转和平移的相机位姿矩阵

 Mat homography = Calib3d.findHomography(ReferencePoints2, ReferencePoints1,0,Calib3d.RANSAC);

【问题讨论】:

    标签: java android opencv augmented-reality homography


    【解决方案1】:

    您需要知道相机的内在参数才能做到这一点。

    考虑 z=0 平面。重点

     X=(x,y,0,1)'
    

    投影到图像上

    p=P*X.
    

    现在使用分解

    P=K[R t],
    

    其中 K 是校准矩阵,[R t] 是外部参数。由于z=0,R的第三列向量乘以零。我们现在可以删除第 3 列来获取

    p=K*[r1 r2 t]*(x,y,1)=H*(x,y,1),
    

    其中 H 是平面单应性。

    您已经从例如计算 H已知点。现在可以恢复R的第一列和第二列以及向量t了

    [r1 r2 t]=inv(K)*H.
    

    确保 r1 和 r2 是单位长度,那么 t 是正确的平移向量。 R 的第三列向量可以恢复,因为 R 是正交的,例如使用叉积。

    r3=cross(r1,r2).
    

    由于 H 是一个测量值,因此您计算的 r1 和 r2 并不准确。您可以使用 SVD 获得最接近测量值的旋转矩阵。然后你可以组成一个投影矩阵

    P=K[r1 r2 r3 t]
    

    根据您的 2D 坐标系在坐标系中投影任何 3D 点。

    这里有一些课程资料,描述了这种情况。

    https://www.dropbox.com/s/qkulg4j64lyn0qa/2018_proj_geo_for_cv_projcv_assignment.pdf?dl=0

    这是一个相关的问题。 Computing camera pose with homography matrix based on 4 coplanar points

    正如@nbsrujan(谢谢)指出的那样,对于那些使用 OpenCV 的人来说,有一个 function 可以在给定内在函数的情况下将单应性分解为平移和旋转矩阵。

    【讨论】:

    • 非常感谢@André Aichert
    【解决方案2】:

    OpenCV 有一个function,它可以将 Homography 分解为平移和旋转矩阵。但是,我们必须从该函数返回的可能矩阵数组中选择正确的平移和旋转矩阵对。

    法线向量是第一个相机帧中的表面法线。如果您知道初始帧的相机在世界中的旋转,它可用于从可能性列表中过滤出正确的平移和旋转对。

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 2013-12-06
      • 2011-10-14
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2014-06-10
      相关资源
      最近更新 更多