在计算消失点的方向时,俯仰的微小变化会导致180度旋转?

时间:2016-09-18 02:58:41

标签: 3d rotation computer-vision rotational-matrices

我必须在数学的某个地方犯错误,但我似乎无法找到逻辑中的缺陷。我们可以使用2个(3个)世界系统消失点的位置来计算相机相对于某个3D世界坐标系的旋转方向。如果摄像机几乎与世界系统对齐,我们可能会在图像平面上的位置(10000000, 0)和位置(0, 10000000)处的Y轴消失点找到X轴消失点。这意味着这些轴上的线在图像中几乎是平行的。并且K是相机的内部参数,我们可以使用(向消失点矩阵添加1以使其成为3D):

r1 = (K.inverse * vp_x) / norm(K.inverse * vp_x)
r2 = (K.inverse * vp_y) / norm(K.inverse * vp_y)
r3 = cross_product(r1, r2)

获取旋转矩阵的3列,得到接近的值:

1  0  0
0  1  0
0  0  1

这是我们所期望的,因为系统几乎是一致的。但是,如果我们每隔一段时间对相机进行俯仰,则Y轴的线会聚在图像平面上的y的负值。例如,消失点位置现在可能显示在(0, -10000000)。但是使用与以前相同的数学,我们最终得到一个旋转矩阵:

1  0  0
0 -1  0
0  0 -1

这表明围绕X轴旋转180度。当然,我们面向的方向几乎和以前一样,所以180度旋转并没有意义。我一定错过了什么,但我不知道是什么。有什么建议?谢谢!

1 个答案:

答案 0 :(得分:2)

你从错误的假设开始。 (约定:我们将围绕Y轴的运动称为俯仰。但是Y轴在摄像机惯例中是垂直的。在航空航天惯例中,垂直轴是Z.有时在计算机视觉中最好称之为"平移"。滚动变为"倾斜")

1)如果您有音高移动,那么您所改变的是 X轴的收敛。因此将vy从(0,1e6)移动到(0,-1e6)不是俯仰移动,而是围绕X轴旋转(滚动)。

2)提醒当正弦或余弦变为零时,旋转矩阵可能具有奇点。因此,在这种情况下导出它们可能是个问题

3)从第2点开始,记住你说过:

  

导致接近

它完全不同! (我将用一些Matlab代码证明它) 我将颠倒投射3个世界经典的等式。我们对俯仰运动很感兴趣所以我将投影X轴versor(1,0,0)。注意Z = 0(这个版本位于图像平面上)* 让我们建立一个音调矩阵(see this reference)

R = [cos(a), 0, sin(a);0, 1, 0; -sin(a), 0 , cos(a)];
disp(R)

M1 = [1; 0; 0];
u = K*R*M1;
disp(u);
M2 = [0; 1; 0];
v = K*R*M2;
disp(v);
M3 = [0; 0; 1];
w = K*R*M3;
disp(w);

如果我有一个小的正音高(a = 0.02)我 u 等于

  495.9003
   -3.9997
   -0.0200

然后用小的负间距(a = -0.02) u 等于

  503.8997
    3.9997
    0.0200

你们都将这些向量标准化(除以大约500的标准),在这两种情况下你都得到1,0,0但你定义地失去了#34;方向"信息与众不同。是的,这个例子是关于预计的片段,但想法是相同的

4)您可以从r3 中提取角度(理论上),而不会忽略近零分量。

  

PITCH的角度(绕Y旋转)= arctan(r3(1)/ r3(3))

     

滚动角度(绕X旋转)= arcsin(r3(2))

5)如果逆时针旋转角度为正,消失点应为正还是负?

*因为您正在投影已经位于图像平面中的点,即距离相机中心无限远的点,它可以投影在右侧和左侧。始终处理"无限"小心