【问题标题】:Similarity transformation of projection matrix投影矩阵的相似变换
【发布时间】:2024-01-21 08:28:01
【问题描述】:

我有一个从世界坐标系 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 中的投影矩阵。

【问题讨论】:

  • 请检查您的问题。你说你有“世界坐标系 1 和 2 中的投影矩阵 P_j ..”。然后你说“我现在想将......投影矩阵从系统 1 转换为系统 2。”如果两者都有,则无需转换。
  • @Gene 措辞不明确。我相应地改变了我的问题。
  • 我会说这个问题属于math.stackexchange.com
  • downvote 请解释一下。
  • 这是一个合理的 OpenGL 编程问题。我投了赞成票。

标签: opengl opencv camera computer-vision transformation


【解决方案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

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

【讨论】:

  • 我应该更详细地描述我的问题。我只添加了 OpenGL 标签,因为我使用它来可视化我的数据,这是计算机视觉中运动解决方案结构的结果。这里的相机是图像采集在 3D 对象空间中的实际位置,可以从投影矩阵的逆矩阵中提取。所以,我实际上确实想应用相似变换。我不知道 OpenGL 术语在这里可能会造成混淆。尽管如此,还是非常感谢!我想我会按照上面的建议在 math.stackexchange 上试试运气(我以前不知道)?
【解决方案2】:

我自己找到了解决方案:

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

x' = P1 * X1

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

X2 = S * X1

获取投影矩阵P2,将3D点转换为 目标系统到不改变的二维点:

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

因此:

P2' = P1 * S^-1

最后,需要按比例因子进行归一化:

P2 = s * P2'

【讨论】:

  • 我正在尝试复制这个数学。您如何计算(或推理)标准化比例因子?
  • 首先,使用缩放因子缩放等式的任一侧并不会使其无效,因为投影空间与缩放无关 (x' = w*(u, v, 1).T 而 x'是所有 w 的同一个点,“点实际上是射影空间中的射线”)。因此,投影空间中的投影矩阵和点仅在比例因子之前是唯一的。因此,缩放投影矩阵不会将投影从 X 更改为 x'。归一化投影矩阵最终只需要为了在欧几里得空间 (R, t) 中提取正确的位置。希望有帮助吗?
  • 确实如此,谢谢。最后,投影矩阵的归一化,你用哪种方式对其进行归一化?我发现按 1/infinity_norm 缩放效果很好,但我没有理由说明为什么要使用它。再次感谢您的回复。
  • 我宁愿说你必须用 1 / norm(R2, 2) 标准化,其中 R2 来自 P2 = [R2 | t2],基本相当于旋转矩阵的固有尺度。