相机姿态估计:如何解释旋转和平移矩阵?

oar*_*ish 5 c++ opencv computer-vision coordinate-transformation structure-from-motion

假设我在两个图像之间有良好的对应关系并尝试恢复它们之间的相机运动.我可以使用OpenCV 3的新设施,如下所示:

 Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 1, mask);

 int inliers = recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask);

 Mat mtxR, mtxQ;
 Mat Qx, Qy, Qz;
 Vec3d angles = RQDecomp3x3(R, mtxR, mtxQ, Qx, Qy, Qz);

 cout << "Translation: " << t.t() << endl;
 cout << "Euler angles [x y z] in degrees: " << angles.t() << endl;
Run Code Online (Sandbox Code Playgroud)

现在,我无法绕过什么R,t实际上是什么意思.它们是将坐标从相机空间1映射到相机空间2所需的变换,如同p_2 = R * p_1 + t

考虑这个例子,用地面实况手动标记对应关系

在此输入图像描述

我得到的输出是这样的:

Translation: [-0.9661243151855488, -0.04921320381132761, 0.253341406362796]
Euler angles [x y z] in degrees: [9.780449804801876, 46.49315494782735, 15.66510133665445]
Run Code Online (Sandbox Code Playgroud)

我尝试将其与我在图像中看到的相匹配并提出解释,[-0.96,-0.04,0.25]告诉我,我已向右移动,因为坐标沿着负x轴移动,但它也会告诉我,我随着坐标沿正z轴移动,我们走得更远了.

我还围绕y轴旋转了相机(左边,我认为这是围绕负y轴的逆时针旋转,因为在OpenCV中,y轴向下指向,不是吗?)

问题:我的解释是否正确,如果不正确,那么正确的解释是什么?

oar*_*ish 2

事实证明我的解释是正确的,这个关系p2 = R * p1 + t确实成立。可以通过使用cv::triangulatePoints()cv::convertPointsFromHomogeneous从对应点(相对于相机 1)获取 3D 坐标,然后应用上述方程来验证这一点。与相机 2 的相机矩阵相乘即可​​得出p2图像坐标。