变量s有一个特定的含义:2D点与其3D反投影之间存在一对多的对应关系。换句话说,有无数个可能的 3D 点位于最终终止于或从像素沿 u、v、f 方向发射的射线上。这就是 s 的含义:只是一对多关系的指示符。
当度量重建在比例上是模棱两可的时,Francesco 似乎谈到了运动结构的一般情况。然而,问题可能完全不同。让我改写一下,告诉我是否正确:你有一个你知道的静态对象坐标系。您有一个在该系统中围绕 X 轴旋转的目标,并且您知道该系统中 4 个点在零旋转时的 3d 坐标。要在旋转后获得新的 3D 坐标,您只需要一个旋转角度,同时为您提供一组已知点的 2D 投影。这是一个简单的任务;如果这是你真正追求的。
为什么任务很简单?每个点生成两个约束,如 u= v=;未知数是一 - 角度所以一点就足以计算它。知道这个角度后,您可以旋转已知的 3D 点来更新它们的坐标。总体来说只要 1 分就足够解决任务了:
- 将针孔相机方程的两边与左侧的固有矩阵的逆相乘以消除固有参数。你最终会得到这个:
s' [u' v' 1]T = A [X Y Z]T + t,其中 A=R*Ralpha
-
技术上 Ralpha - 我们的未知数 - 仅取决于角度 alpha 但由于依赖是非线性的,我们可以使用具有 2 个条目的矩阵的线性乘法:s = sin(alpha) 和 c = cos(alpha), alpha -绕x轴旋转的角度
1 0 0
Ralpha = 0 c -s
0 s c
-
去掉 s',注意 s' = a31X + a32Y + a32Z + tz
并将其插入两个约束:
s'u' = (a31X + a32Y + a32Z + tz)u' = a11X + a12Y + a13Z + tx
s'v' = (a31X + a32Y + a32Z + tz)v' = a21X + a22Y + a23Z + ty
求矩阵 A 现在是求解线性方程组 Kx=b 的简单任务,通过重新排列我们得到的项
b = [tx-tzu', ty-tzv'] T,
x = [a11, a12, a13, a21, a 22, a23, a31, a32, a33]T
对于单点对应K是
-X, -Y, -Z, 0, 0, 0, Xu’, Yu’, Zu’
0, 0, 0, -X, -Y, -Z, Xv’, Yv’, Zv’
但是如果有更多的对应关系,可以添加更多的行。
用伪逆求解得到 x = (KTK)-1KTb,
可以通过二次残差的非线性最小化进一步优化。
在你计算出 x 并用它重新组装 A 之后,你必须确保它是一个真正的旋转矩阵。通常这是通过 SVD 完成的:A=ULVT,然后重新分配 A=UVT。最后,得到 Ralpha = RTA,它为您提供了一个旋转矩阵,您可以将其应用于您已知的 3D 坐标以获取它们在对象坐标系中的新值,或者使用整个矩阵 A 来获取它们在相机坐标系中。
这可能看起来很乱,但它是一组典型的获取外部相机参数的步骤,并且您已经完成了(尽管您可能使用了库函数)。