假设我在两个图像之间具有良好的对应关系,并尝试恢复它们之间的相机运动。
我可以使用 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;
现在,我很难理解什么R
and 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]
我尝试将其与我在图像中看到的内容相匹配并提出解释,即[-0.96,-0.04,0.25]
告诉我,我已向右移动,因为坐标已沿负 x 轴移动,但它也会告诉我,我已移得更远,因为坐标已沿正 z 轴移动。
我还围绕 y 轴旋转了相机(向左旋转,我认为这将是围绕负 y 轴逆时针旋转,因为在 OpenCV 中,y 轴指向下方,不是吗?)
问题:我的解释正确吗?如果不正确,正确的解释是什么?