【问题标题】:3D Camera coordinates to world coordinates (change of basis?)3D相机坐标到世界坐标(改变基础?)
【发布时间】:2013-06-17 02:52:50
【问题描述】:

假设我有一个对象相对于相机的坐标 X、Y、Z 和方向 Rx、Ry、Rz。 另外,我还有这个相机在世界上的坐标U、V、W和方向Ru、Rv、Rw。

如何将对象的位置(位置和旋转)转换为其在世界中的位置?

对我来说这听起来像是基础的改变,但我还没有找到明确的来源。

【问题讨论】:

    标签: opencv geometry computer-vision linear-algebra projective-geometry


    【解决方案1】:

    其实你有两个依据:一个是相对于相机的,另一个是绝对的(世界)。所以你基本上想把你的相对数据转换成绝对数据。

    位置

    这是最简单的。您必须通过向量 t(U,V,W) 平移 (X,Y,Z) 位置。所以你所有的绝对位置都是 (Ax, Ay, Az) = (X,Y,Z)+t = (X+U,Y+V,Z+W)。

    方向

    这有点困难。您必须找到将相机从(我假设)(0,0,1)旋转到(Ru,Rv,Rw)的旋转矩阵。您应该查看Basic Rotation Matrices,以便将 (0,0,1) 到 (Ru,Rv,Rw) 的 2 个旋转分解(例如,一个根据 X 轴,一个根据 Z 轴)。我建议你在一张纸上画出绝对基和向量(Ru,Rv,Rw),这是获得正确结果的最简单方法。

    所以你有 2 个基本的旋转矩阵 r1 和 r2。得到的旋转矩阵 r = r1*r2(或 r2*r1,没关系)。所以你的对象的绝对方向是 (ARx, ARy, ARz) = r*(Rx,Ry,Rz)。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      我发现这个主题非常清楚的文档。 http://www.cse.psu.edu/~rcollins/CSE486/lecture12.pdf

      除其他外,它处理反向操作,即从世界到相机的 3D 坐标。

      PC = R ( Pw - C ) 其中,Pc 是相机世界中的一个点,Pw 是普通世界中的一个点,R 是旋转矩阵,C 是相机平移。

      可惜添加latex公式比较麻烦,所以我将给出一些matlab代码。

      function lecture12_collins()
      % for plotting simplicity I choose my points on plane z=0 in this example
      % Point in the world
      Pw = [2 2.5 0 1]';
      % rotation
      th = pi/3;
      % translation
      c = [1 2.5 0]';
      % obtain world to camera coordinate matrix
      T = GetT(th, c);
      % calculate the camera coordinate
      Pc = T*Pw
      % get the camera to world coordinate
      T_ = GetT_(th, c)
      % Alternatively you could use the inverse matrix
      % T_ = inv(R*C)
      
      % calculate the worldcoordinate
      Pw_ = T_*Pc
      
      assert (all(eq(Pw_ ,Pw)))
      
      
      function T = GetT(th, c)
      % I have assumed rotation around the z axis only here.
      R = [cos(th) -sin(th) 0 0
           sin(th)  cos(th) 0 0
                0        0  1 0
                0        0  0 1];
      C = [1  0   0   -c(1)
           0  1   0   -c(2)
           0  0   1   -c(3)
           0  0   0   1];
       T = R*C;
      
      function T_ = GetT_(th, c)
      % negate the angle
      R_ = [cos(-th) -sin(-th) 0 0
           sin(-th)  cos(-th) 0 0
                0        0  1 0
                0        0  0 1];
      % negate the translation
      C_ = [1  0   0   c(1)
           0  1   0   c(2)
           0  0   1   c(3)
           0  0   0   1];
      T_ = C_*R_
      

      到目前为止,这只是关于位置。我通过使用我对旋转的额外知识解决了旋转。我知道我的相机垂直于物体,并且它的旋转仅围绕 z 轴。我可以添加相机和物体的旋转。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 2018-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多