6

假设我在两个图像之间有很好的对应关系,并尝试恢复它们之间的相机运动。我可以为此使用 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;

现在,我很难理解什么Rt真正的意思。它们是否是将坐标从相机空间 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 轴指向下方,不是吗?)

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

4

4 回答 4

2

其实你的解释是正确的。

首先,关于 y 轴的方向,您是正确的。有关 OpenCV 的相机坐标系的说明,请参见此处

您的代码会将 R 和 t 从第二个摄像头返回到第一个摄像头。这意味着如果 x1 是第一个图像中的一个点并且 x2 是第二个图像中的一个点,则以下等式成立x1 = R*x2 + t。现在,在您的情况下,右侧图像(前视图)来自摄像头 1,而汽车的左侧图像(侧视图)来自摄像头 2。

看看这个方程,我们看到首先应用了旋转。因此,图像您的相机当前拍摄左帧。现在您的 R 指定绕 y 轴旋转约 46 度。由于角度 alpha 的旋转点与将坐标轴反向旋转该角度相同,因此您的 R 告诉您向左旋转。正如您自己指出的那样,如果查看图片,这似乎是正确的。由于围绕其他轴的旋转很小且难以成像,因此我们在此省略它们。因此,在应用旋转之后,您仍然站在拍摄左框架的相同位置,但您的相机或多或少指向汽车后部或汽车正后方的空间。

现在让我们看看平移向量。您对向右移动和更远移动的解释也是正确的。让我试着解释一下原因。想象一下,从您当前的位置开始,使用新的相机方向,您只能向右移动。您会直接撞到汽车或需要将相机放在发动机罩上方。因此,向右移动后,您还需要进一步移动才能到达您拍摄正确照片的位置。

我希望这个解释能帮助你想象你的 R 和 t 描述的运动。

于 2015-07-17T08:55:53.603 回答
2

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

于 2015-08-08T15:30:57.573 回答
1

你的解释听起来对我来说是正确的。我不是 100% 关于 OpenCV 中轴的方向,但我相信你对 Y 轴的看法是正确的。

输出也很有意义,不仅从代码的角度来看,而且如果您查看这两个图像,您可以大致想象完整 90 度旋转将指向的位置(它基本上是相同的角度,但在汽车的另一侧)

这也是通过刚体运动机制对该概念的一个相当不错的解释:http: //nghiaho.com/ ?page_id=671

于 2015-07-16T13:31:41.903 回答
1

让我们来看看。OpenCV 相机坐标系为“X 朝向图像右侧,Y 朝向图像底部,Z = X x Y 朝向场景”。Q=[R|t]是从camera2到camera1的坐标变换,所以t是以camera1为根,以camera2为顶点的向量,以camera1帧表示。因此,您的平移向量意味着camera2位于camera 1的左侧,根据您的图像,只有当汽车的侧视图在camera2中并且汽车的前视图在camera 1中时才有可能。这与正Z分量一致翻译,因为在侧视图中,汽车看起来离相机更远。

此标识也与您计算的欧拉角一致:它们在 OpenGL 约定中返回,从而表示从源到目标的旋转。在您的情况下,围绕 camera1 的垂直轴旋转 46 度,与向下的 Y 轴逆时针旋转,您将看到您所拥有的侧视图。

于 2015-07-16T20:51:36.017 回答