3D相机坐标到世界坐标(基础的变化?)

时间:2013-06-20 09:44:06

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

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

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

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

2 个答案:

答案 0 :(得分:3)

实际上你有两个基础:一个是相对于相机,另一个是绝对的(世界)。因此,您基本上希望将相关数据转换为绝对数据。

位置

这是最简单的一个。您必须通过向量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)。

希望这有帮助!

答案 1 :(得分:2)

我发现这个主题很清楚。 http://www.cse.psu.edu/~rcollins/CSE486/lecture12.pdf

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

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

不幸的是,添加乳胶配方相当麻烦,所以我会给出一些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轴。我可以添加相机和物体的旋转。