从消失点计算方向时,音高的微小变化会导致 180 度旋转?

Tiny change in pitch results in 180 degree rotation when calculating orientation from vanishing points?

我一定是在数学的某个地方犯了一个错误,但我似乎找不到我逻辑中的缺陷。我们可以使用 2 个(共 3 个)世界系统消失点的位置来计算相机相对于某个 3D 世界坐标系的旋转方向。如果相机几乎与世界系统对齐,我们可能会在图像平面上的位置 (10000000, 0) 处找到 X 轴消失点,在位置 (0, 10000000) 处找到 Y 轴消失点。这意味着这些轴上的线在图像中几乎平行。并且 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 度旋转没有意义。我一定是错过了什么,但我不知道是什么。有什么建议么?谢谢!

你从错误的假设开始。 (惯例:我们称绕Y轴的运动为pitch。但是在相机惯例中Y轴是垂直的。在航空航天惯例中垂直轴是Z。有时​​在计算机视觉中它更好将其命名为 "panning"。Roll 变为 "tilting")

1) 如果你有一个俯仰移动,你改变的是X轴的收敛。所以将 vy 从 (0,1e6) 移动到 (0,-1e6) 不是俯仰移动,而是围绕 X 轴的旋转(滚动)。

2) 提醒一下,当正弦或余弦趋于零时,旋转矩阵可能有奇点。所以在那种情况下推导它们可能是个问题

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

resulting in something close to

它让一切变得不同! (我会用一些 Matlab 代码来证明) 我将反转投影 3 个世界的等式。我们对俯仰运动感兴趣,所以我将投射 X 轴方向 (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,但是你明确地失去了 "direction" 不同的信息。是的,这个例子是关于projected segment的,但是思路是一样的

4) 您可以从 r3 估计角度(理论上)而不忽略 接近零的分量。

ANGLE OF PITCH (rotation around Y) = arctan(r3(1)/r3(3))

ANGLE OF ROLL (rotation around X) = arcsin(r3(2))

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


*因为你投影的点已经位于图像平面上,一个距离相机中心无限远的点,它可以被投影到右边和左边。始终小心处理 "infinite"