opengl - 投影矩阵的相似变换

标签 opengl opencv camera computer-vision transformation

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

我现在想将系统 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 中的投影矩阵。

最佳答案

你的问题不清楚。 相似变换 不是传统的 OpenGL 术语。管道从对象坐标开始。模型转换 M 将这些转换为世界坐标(只有 一个 世界坐标系)。 View 变换 V 将这些转换为眼睛坐标。有时 View 矩阵被称为相机矩阵,因为 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

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

关于opengl - 投影矩阵的相似变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19866797/

相关文章:

不同CG/GLSL/HLSL功能的表现

opengl - 全向阴影贴图聚光灯

c++ - 搜索图像上的轮廓

python - 使用opencv python提取图片上的选定区域

opengl - GL_COLOR_BUFFER_BIT 和更多显示“Xcode 未声明的标识符

c++ - 使用 OpenGL 制作另一个对象

python - 使用套接字在 Python 中从服务器发送网络摄像头流

javascript - 从浏览器访问相机

c++ - 使用 opencv 和 PlayStation Eye 进行高速视频捕获

iphone - UIImagePickerController 不显示