3D相机坐标转换为世界坐标(基底变换?)

7
假设我有一个物体相对于相机的坐标 X、Y、Z 和方向 Rx、Ry、Rz。 此外,我还有这个相机在世界上的坐标 U、V、W 和方向 Ru、Rv、Rw。
我如何将物体的位置(位置和旋转)转换为其在世界中的位置?
对我来说,这听起来像是基础变换,但我还没有找到清晰的来源。
2个回答

4

我找到了这篇文件,对这个主题非常清楚。 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轴。我可以将相机和物体的旋转相加。


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)。你应该看看基本旋转矩阵,以便分解将(0,0,1)带到(Ru,Rv,Rw)的2次旋转(例如根据X轴和根据Z轴的旋转)。我建议你在纸上画出绝对基础和向量(Ru,Rv,Rw),这是获取正确结果的最简单方法。
所以你有两个基本的旋转矩阵r1和r2。结果旋转矩阵r=r1*r2(或r2*r1,没有区别)。因此,你的物体的绝对定位是(ARx, ARy, ARz)=r*(Rx,Ry,Rz)。
希望这可以帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接