当所有三个坐标在对象坐标系中都可以变化时,查找三维坐标



我有目标在物体坐标系中4个共面点的三维坐标。我在视频的每一帧中都有他们的2D坐标。我还使用solverpnp()计算了相机的内在参数(M)、对象坐标系和相机坐标系之间的R(旋转)和t(平移)矩阵。我从这里读到了完整的过程,非常清楚。这也类似于我遵循的过程。因此,我想使用相同的方程式


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

用于计算我的三维坐标,但我没有常数,正如链接所解释的用于计算s。我的目标在OpenCV坐标系中绕x轴旋转。我的问题是-

  1. 有人能给我一个找到s的方法吗?这个计算肯定是强制性的吗?或者我可以使用s=1吗
  2. 有没有其他方法可以用我的参数来计算三维点


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

Francesco似乎谈到了一个从运动到结构的一般情况,当度量重建在尺度上是模糊的。然而,问题可能大不相同。让我重新表述一下,告诉我我说得对不对:你有一个静态物体坐标系,你知道。你有一个目标在这个系统中围绕X轴旋转,你知道这个系统中4个点的三维坐标为零。要在旋转后获得新的三维坐标,只需要一个旋转角度,同时为已知点提供一组二维投影。这是一项简单的任务;如果这是你真正想要的。

为什么任务很容易?每个点生成两个约束,如u=v=;未知的数量是1-角度,所以一个点就足以计算它。知道这个角度,你可以旋转已知的三维点来更新它们的坐标。总的来说,只有1分就足以解决任务:

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

    1  0   0
    Ralpha =  0  c  -s
    0  s   c
    
  3. 去掉s,注意s=a31X+a32Y+a32Z+tz并将其插入两个约束:

    ‘u’=(a31X+a32Y+a32Z+tZ)u’=a11X+a12Y+a13Z+tX

    'v'=(a31X+a32Y+a32Z+tZ)v'=a21X+a22Y+a23Z+tY

求矩阵A现在是求解线性方程组Kx=b的简单任务,其中通过重新排列项,我们得到

b=[tx-tzu',ty-tzv']t

x=[a11,a12、a2123;a3123]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在相机坐标系中获取它们。

这看起来可能很混乱,但这是一组典型的步骤,例如,获取外部相机参数,并且您已经完成了这项工作(尽管您可能使用了库函数)。

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


如果你知道R和t,那么你的问题可以简化为根据以下方程估计(X0,Y0和Z),其中M、u和v是已知的:

su,v[u v 1]T=M[X0Y0Z0\sub>]T

注意,su,v不是一个常数因子,而是取决于u和v。由于M的特殊形式,它是对角的,最后一个元素等于1,我们可以很容易地看到su,v=Z0。因此,如果你只知道M、R、t、u和v,你只能估计(X0/Z0,Y0/Z0\/sub>,1)。这意味着您无法估计两个不同图像点之间的相对深度(它们的深度都等于一),因此您无法获得真正的3D重建。

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

只有知道绝对比例,例如图像中可见的已知对象的长度。

但你真的关心绝对的规模和距离吗?你应该仔细考虑你的应用程序,然后决定你是否真的需要知道物理距离和大小。很难把它做好,尤其是如果需要很大程度的准确性,而且大多数情况下这是不必要的。

要将单应矩阵(将世界中的平面映射到其图像)分解为旋转和平移,请执行以下5个步骤:
1。注意M*[R|T]*[x,y,0,1]T可以通过去掉Z坐标的占位符来简化。这相当于以Z=0的方式在平面上定位对象坐标系。
2。注意,这有效地扼杀了旋转矩阵中的第三列,使得针孔相机方程看起来像单应性:
s[u,v,1]T=M*R|T*[x,y,1]=H*[x、y,1],其中R|T=
R11R12Tx
R22Ty
R31R32Tz3。现在将本征矩阵M合并到同态中:
M*R|T=H,然后R|T=M-1H=H2。使用SVD:H2=ULVT分解H2,然后用W代替表示缩放的L,使缩放均匀且单位为真旋转;R|T然后变为UWVT,其中W=
10
01
00
4。通过矢量乘积r3=r1xr2计算R的第三列以保证它与前两个正交,并且R是真正的旋转矩阵
5.您可以选择性地通过将比例因子k=sum(Rij/H2ij)/6(其中i=1..3,j=1..2)进行因子分解来恢复平移T,然后计算T=k*H2的第三列。最后,如果Tz<0逆R和T.

相关内容

最新更新