旋转和平移矩阵来自单应性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是平面单应性。
您已经从例如已知点计算了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
这是一个相关的问题。 基于4个共面点计算具有单应矩阵的相机姿态
正如@nbsrujan(感谢)指出的那样,对于那些使用OpenCV的人来说,有一个函数可以将单应性分解为内在函数的平移和旋转矩阵。
OpenCV具有可以将Homography分解为平移和旋转矩阵的function。 但是,我们必须从此函数返回的可能矩阵数组中选择正确的平移和旋转矩阵对。
法线向量在第一个摄像机的帧中是表面法线。 如果你知道相机在初始帧中的旋转,它可以用来从可能性列表中滤出正确的平移和旋转对。