当所有3个坐标在对象坐标系中变化时,查找3D坐标

时间:2014-02-26 07:19:23

标签: ios opencv 3d 2d computer-vision

我在物体坐标系中有我的目标的4个共面点的3D坐标。我在视频的每一帧中都有它们的2D坐标。我还计算了相机的内在参数(M),使用solvepnp()在对象坐标系和摄像机坐标系之间的R(旋转)和t(平移)矩阵。 我已经阅读了from here完整的过程,这一过程非常清楚。它也与我所遵循的过程类似。因此我想使用相同的等式

[u v 1] T = M(R [X Y Z] T + t)

用于计算我的3D坐标,但我没有常数,因为链接解释了计算s。我的目标在OpenCV坐标系中围绕x轴旋转。我的问题是 -

  1. 有谁能建议我找到s的方法?这个计算肯定是强制性的,还是可以使用s = 1?
  2. 有没有其他方法可以用我的参数计算3d点?

4 个答案:

答案 0 :(得分:1)

变量 s 具有特定含义:2D点与其3D反投影之间存在一对多的对应关系。换句话说,在光线上存在无数个可能的3D点,这些3D点最终在方向u,v,f方向上终止或从像素发射。这是关于:只是一对多关系的指标。

当一个度量重建模糊到规模时,似乎Francesco谈论了一个关于运动结构的一般情况。然而,问题可能完全不同。让我重新说一下,告诉我,如果我做对了:你有一个你知道的静态物体坐标系。你有一个围绕X轴在这个系统中旋转的目标,你知道这个系统中零点旋转的4个点的3d坐标。要在旋转后获得新的3D坐标,您需要的是一个旋转角度,同时给出一组已知点的2D投影。这是一项很容易的任务;如果它是你真正追求的。

为什么这项任务很简单?每个点都会产生两个约束,如u = v =;未知的数量是一个 - 角度,所以一个点足以计算它。知道此角度,您可以旋转已知的3D点以更新其坐标。总的来说只有1分就足以解决这个问题了:

  1. 将针孔相机方程的两侧与左侧的内部矩阵的倒数相乘以去掉内部参数。你最终会得到这个: s'[u'v'1] T = A [X Y Z] T + t,其中A = R * Ralpha
  2. 技术上Ralpha - 我们的未知 - 仅依赖于角度α,但由于依赖性是非线性的,我们可以使用具有2个条目的矩阵的线性乘法:s = sin(alpha)和c = cos(alpha) ,alpha - 围绕x轴旋转的角度

              1  0   0
    Ralpha =  0  c  -s
              0  s   c
    
  3. 通过注意s'摆脱s'。 = a 31 X + a 32 Y + a 32 Z + tz 并将其插入两个约束中:

    s'u'=(a 31 X + a 32 Y + a 32 Z + t z )u'= a 11 X + a 12 Y + a 13 Z + t x

    s'v'=(a 31 X + a 32 Y + a 32 Z + t z )v'= a 21 X + a 22 Y + a 23 Z + t y

  4. 找到矩阵A现在是解决线性方程组Kx = b的简单任务,其中通过重新排列我们的术语

    b = [t x -t z u',t y -t z v'] T

    x = [a 11 12 13 21 22 23 31 32 33 ] T

    单点对应K是

    -X, -Y, -Z, 0,   0,  0, Xu’, Yu’, Zu’
     0,  0,  0, -X, -Y, -Z, Xv’, Yv’, Zv’
    

    但如果有更多的对应关系,可以添加更多行。 用伪逆解决这个问题得到x =(K T K) -1 K T b, 这可以通过二次残差的非线性最小化进一步优化。

    计算x并用它重新组合A后,你必须确保它是一个真正的旋转矩阵。通常这通过SVD完成:A = ULV T 然后重新分配A = UV T 。最后,获得Ralpha = R T A,它为您提供一个旋转矩阵,您可以将其应用于已知的3D坐标以在对象坐标系中获取其新值或使用整个矩阵A来获取它们在相机坐标系中。

    这可能看起来很乱,但这是获取外部相机参数的典型步骤,你已经完成了这个(尽管你可能使用了库函数)。

答案 1 :(得分:1)

编辑:Vlad可能最准确地解决了您的问题。以下内容可能仍有助于澄清一般情况下的数学。


如果您知道R和t,那么您的问题可以简化为估算(X 0 ,Y 0 ,Z 0 )下面的等式,其中M,u和v是已知的:

s u,v [uv 1] T = M [X 0 Y 0 Z 0 ] Ť

请注意,s u,v 不是常数因子,而是取决于u和v。由于M的特殊形式,即最后一个元素等于1的对角线,我们可以很容易地看到那 小号<子> U,V = Z <子> 0 。因此,如果你只知道M,R,t,u和v,你只能估计(X 0 / Z 0 ,Y 0 / Z <子> 0 ,1)。这意味着无法估计两个不同图像点之间的相对深度(它们都具有等于1的深度),因此您无法获得真正的3D重建。

为了估计两个图像点的相对深度,您需要在两个图像中对相同点进行至少两次观察(由具有不同位置的相机获取)。而且,正如Francesco所指出的,即使你有两个图像,你也无法估计重建场景的真实比例,除非你另外知道两点之间的真实3D距离D.

答案 2 :(得分:0)

仅当您知道绝对比例时,例如图像中可见的已知对象的长度。

但你真的关心绝对的规模和距离吗?你应该长时间地考虑你的应用,然后决定你是否真的需要知道物理距离和尺寸。很难做到正确,特别是如果需要很高的准确度,并且通常没有必要。

答案 3 :(得分:0)

要将单应矩阵(将世界中的平面映射到其图像)分解为旋转和平移,请遵循以下5个步骤:
注意,通过去掉Z坐标的占位符,可以简化M * [R | T] * [x,y,0,1] T 。这相当于以Z = 0的方式在平面上定位物体坐标系 2.请注意,这有效地杀死了旋转矩阵中的第三列,因此针孔相机方程看起来像单应性:
s [u,v,1] T = M * R | T * [x,y,1] = H * [x,y,1],其中  [R | T =
  r 11 r 12 t x
  r 21 r 22 t y
  r 31 r 32 t z
3.现在在Homography中加入内在矩阵M:
M * R | T = H,则R | T = M -1 H = H2。 使用SVD分解H 2:H 2 = ULV T 然后用W代替L,用W表示缩放均匀,单位用真正的旋转; R | T则变为UWV T ,其中W =
 1 0
 0 1
 0 0
4.通过向量积r3 = r1xr2计算R的第三列 保证它与前两个正交,R是一个真正的旋转矩阵 5.您可以选择通过分解比例因子来恢复转换T,该比例因子是k = sum(R ij / H2 ij )/ 6其中i = 1..3 ,j = 1..2,然后计算T = k * H2的第三列。最后,如果Tz <0,则逆R和T