我正在使用Java在android应用程序上工作,我使用findHomography()用opencv计算了单应性,如何通过单应性找到包含旋转和平移的相机姿势矩阵
Mat homography = Calib3d.findHomography(ReferencePoints2, ReferencePoints1,0,Calib3d.RANSAC);
答案 0 :(得分:1)
您需要知道相机的固有参数。
考虑z = 0平面。重点
X=(x,y,0,1)'
投影到图像上
p=P*X.
现在使用分解
P=K[R t],
其中,K是校准矩阵,[R t]是外部参数。由于z = 0,R的第三列向量乘以零。现在,我们可以删除第三列以获取
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]
根据您的同构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可以将单应性分解为给定内在函数的平移和旋转矩阵。
答案 1 :(得分:1)
OpenCV具有function,可以将同构图像分解为平移和旋转矩阵。但是,我们必须从此函数返回的可能矩阵的数组中选择正确的平移和旋转矩阵对。
法线向量是第一个摄像机帧中的表面法线。如果您知道相机在初始帧中的旋转角度,则可以用来从可能性列表中滤除正确的平移和旋转对。