Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 相机姿态估计:如何解释旋转和平移矩阵?_C++_Opencv_Computer Vision_Coordinate Transformation_Structure From Motion - Fatal编程技术网

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

C++ 相机姿态估计:如何解释旋转和平移矩阵?,c++,opencv,computer-vision,coordinate-transformation,structure-from-motion,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,

假设两幅图像之间有良好的对应关系,并尝试恢复它们之间的相机运动。 我可以使用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;
我试图将其与我在图像中看到的匹配,并给出解释,
[-0.96,-0.04,0.25]
告诉我,我已经向右移动,因为坐标已经沿着负x轴移动,但它也会告诉我,我已经移动得更远,因为坐标已经沿着正z轴移动

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


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

我觉得你的解释很正确。我对OpenCV中的轴的方向不是100%,但我相信你对Y轴的看法是正确的

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

这也是通过刚体运动力学对该概念的一个相当不错的解释:
让我们看看。OpenCV摄影机坐标帧是“X朝向图像右侧,Y朝向图像底部,Z=X X Y朝向场景”。Q=[R | t]是从camera2到camera1的坐标变换,因此t是以camera1为根的向量,尖端位于camera2,以camera1帧表示。因此,您的平移向量意味着camera2位于摄影机1的左侧,根据您的图像,只有当汽车的侧视图位于camera2中,而汽车的前视图位于摄影机1中时,才可能出现这种情况。这与平移的正Z分量一致,因为在侧视图中,汽车看起来离摄像机更远


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

实际上你的解释是正确的

首先,关于y轴的方向,您是正确的。有关OpenCV的摄影机坐标系的图示,请参见

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

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

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


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

事实证明我的解释是正确的,p2=R*p1+t的关系确实成立。可以使用
cv::triangulatePoints()
cv::ConvertPoints fromSemicular
从相应的点(相对于相机1)获得三维坐标,然后应用上述方程来验证这一点。与摄像头2的摄像头矩阵相乘,然后得到
p2
图像坐标。

但正z分量会告诉我camera2已向汽车移动,但这与camera2是左侧图像的解释不符。我遗漏了什么?重读我写的:“t是以camera1为根的向量,尖端在camera2”。t的正Z分量仅表示camera2的中心位于camera1的XY平面之前,即位于camera1的中心之前。考虑到您的图像,这是完全合理的:只需想象在视图中延伸汽车前部的图像平面,然后确定侧视图的相机应位于该平面的哪一侧。另外,如果你觉得答案有用,请向上投票/接受。如果我这样做,我觉得2号摄像机的中心在1号摄像机的后面,所以z应该是负数。但是由于旋转的原因,它不是很清楚。
Translation: [-0.9661243151855488, -0.04921320381132761, 0.253341406362796]
Euler angles [x y z] in degrees: [9.780449804801876, 46.49315494782735, 15.66510133665445]