Opencv 3D摄像机坐标到世界坐标(基础改变?)

Opencv 3D摄像机坐标到世界坐标(基础改变?),opencv,geometry,computer-vision,linear-algebra,projective-geometry,Opencv,Geometry,Computer Vision,Linear Algebra,Projective Geometry,假设我有一个物体相对于摄像机的坐标X,Y,Z和方向Rx,Ry,Rz。 另外,我有这个相机在世界上的坐标U,V,W和方位Ru,Rv,Rw 如何将对象的位置(位置和旋转)转换为其在世界中的位置 这听起来像是基础的改变,但我还没有找到一个明确的来源。事实上,你有两个基础:一个是相对于相机的,另一个是绝对的(世界)。因此,您基本上希望将相对数据转换为绝对数据 位置 这是最简单的。你必须用向量t(U,V,W)平移(X,Y,Z)的位置。所以你的绝对位置是(Ax,Ay,Az)=(X,Y,Z)+t=(X+U,Y

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

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


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

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

位置

这是最简单的。你必须用向量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)


希望这有帮助

我发现这篇文章的主题非常明确。

除其他外,它处理反向操作,即从世界坐标转换为摄影机三维坐标

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

不幸的是,添加latex公式相当麻烦,因此我将给出一些matlab代码

函数讲师12_collins()
%为了便于打印,在本例中,我选择平面z=0上的点
%世界之角
Pw=[2.5 0 1];
%轮换
th=pi/3;
%翻译
c=[12.50]';
%获取世界到相机的坐标矩阵
T=GetT(th,c);
%计算相机坐标
Pc=T*Pw
%把相机调到世界坐标
T=GetT(th,c)
%或者,您可以使用逆矩阵
%T=库存(R*C)
%计算世界坐标
Pw_uux=T_uu*Pc
断言(全部(等式(Pw,Pw)))
函数T=GetT(th,c)
%这里我只假设绕z轴旋转。
R=[cos(th)-sin(th)0
sin(th)cos(th)0 0
0        0  1 0
0        0  0 1];
C=[10-C(1)
01 0-c(2)
01-c(3)
0  0   0   1];
T=R*C;
函数T=GetT(th,c)
%否定角度
R_u=[cos(-th)-sin(-th)0
sin(-th)cos(-th)0
0        0  1 0
0        0  0 1];
%否定译文
C_u0=[1 0 C(1)
01 0 c(2)
01 c(3)
0  0   0   1];
T=C*R_
到目前为止,这只是关于位置的问题。我用我对旋转的额外知识解决了旋转问题。我知道我的相机是垂直于物体的,它的旋转只围绕z轴。我可以添加相机和对象的旋转