来自单应性opencv的旋转和平移矩阵

rotation and translation matrix from homography opencv

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

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

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

考虑 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 是平面单应性。

您已经从例如已知点。现在可以恢复 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]

根据您的同轴坐标系,将任意 3D 点投影到坐标系中。

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

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 可以将单应性分解为给定内在函数的平移和旋转矩阵。

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

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