投影矩阵的相似变换

时间:2013-11-08 19:12:57

标签: opengl opencv camera computer-vision transformation

我从世界坐标系1到2有一个相似性变换 S 。我还有一组3D点 x_i 和投影矩阵 P_j 世界坐标系1或2中的(3x4或4x4)摄像机。

我现在想将系统1中的摄像机(投影矩阵)转换为系统2。

转换3D点按预期工作,但我如何使用投影矩阵?

我的方法如下:

S = [Ss*SR | St]
P = [R | t]

反转投影矩阵:

PP = inv(P) = [R.T | -R.T*t] = [RR | tt]

旋转相机的方向:

RR' = SR * RR

缩放,旋转和平移位置:

tt' = Ss*SR*tt + St
PP' = [RR' | tt']

反转变换矩阵以再次获得投影矩阵:

P' = inv(PP')

其中P和P'分别是系统1和2中的投影矩阵。

2 个答案:

答案 0 :(得分:1)

你的问题不清楚。 相似性转换不是传统的OpenGL术语。管道以对象坐标开始。模型变换M将这些带到世界坐标(只有一个世界坐标系)。视图变换V将它们带到眼睛坐标。有时视图矩阵称为相机矩阵,因为V将假想的相机视线矢量和眼睛点分别指向世界负z轴和原点。投影变换P将眼睛坐标带到同质(4d)剪辑坐标。在平行投影中,这些与标准化设备坐标相同。从视角来看,仍然需要执行除法,但这不能表示为4x4矩阵运算,并且对于您想要的并不重要。所以4d中的整个管道都是

d = P V M x

其中d是剪辑/规范化设备坐标,x是对象坐标。您可以在渲染场景时更改任何或所有管道。但改变P或V是不寻常的。

所以你的问题没有多大意义。用眼睛坐标中的点和矢量描述相机矩阵V.如果你想看看那些位于对象空间的位置,只需乘以inv(M)。也许(我在猜测)你拥有的是两个对象空间和相应的模型矩阵,以便将它们带到一个共同的世界:

d = P V M_1 x_1
d = P V M_2 x_2

现在,如果你在对象系统1中有一个眼点和向量,并且需要将它们带到系统2,那就做一件明显的事了。根据x_1求解x_2:

x_2 = inv(M_2) M_1 x_1

要说相机矩阵在“任何”特定坐标系中“没有意义”。矩阵位于坐标系之间。

答案 1 :(得分:1)

我自己找到了解决方案:

投影矩阵P1将3D点投影到图像平面,从而投影到 源坐标系中的2D点:

x' = P1 * X1

可以通过应用将3D点转换为目标系统 相似变换S:

X2 = S * X1

获得改变投影矩阵P2的投影矩阵P2 目标系统到2D点,不会改变:

x' = P2 * X2 = P2 * S * X1 = P1 * S^-1 * S * X1 = P1 * I * X1

因此:

P2' = P1 * S^-1

最后,缩放因子的标准化是必要的:

P2 = s * P2'