gpt4 book ai didi

python - 从 pybullet 了解 View 和投影矩阵

转载 作者:行者123 更新时间:2023-12-05 02:08:53 31 4
gpt4 key购买 nike

在 Pybullet 中处理渲染图像时,必须使用 getCameraImageviewprojection 矩阵作为输入(pybullet 也有生成这些矩阵的函数)。理论上,投影矩阵应该是 P = K[R|t],它可以重写为 P = [M|-MC] 所以我们理论上可以使用 M 的 RQ 分解,其中 R 是上三角矩阵。所以我们可以从投影矩阵中恢复 K 和 [R|t](请记住,从 RQ 分解得到的 R 不是从 R|t 得到的 R)。但是当我使用例如 scipy.linalg.rq 时,结果不是有效的 K(固有)矩阵。

谁能解释一下投影矩阵是如何精确定义的,pybullet 中的 View 矩阵是什么?以及我们如何使用这些矩阵检索内部和外部参数?

最佳答案

因此 pybullet 通常使用视场(以 rad 为单位的 FOV)构造投影矩阵(source code)

enter image description here

内在矩阵定义为

enter image description here

p_x 和 p_y 是主要点,通常是图像的中心。所以有一些区别:

  1. 维度。 Pybullet 添加第三行(不是第四行)和第四列以保留深度信息。
  2. 忽略第三行元素 2,2(零索引)不是 1。
  3. Pybullet 使用的是 0 偏斜参数。
  4. 它不使用焦距(它使用但它是根据 FOV 计算的)。
  5. Pybullet 假设 p_x = p_y = 0

首先,pybullet 使用 OpenGL 的符号,因此它使用主列顺序 ( read more )。意味着索引时的第一个元素是列而不是行。因此,应该转置来自 pybullet 的实际投影矩阵。

其次,将 FOV 转换为焦距 f 的完整方程为:

enter image description here

因此 pybullet 将焦距乘以 2/h。原因是因为 pybullet 使用标准化设备坐标 ( NDC ) 将值夹在 [-1,1] 之间(将 x 除以宽度将其夹在 [0,1] 并将其乘以 2 将其夹在 [0, 2] 如果主点位于图像 1,1 的中间点,则将其裁剪为 [-1,1])。因此pybullet的焦距是使用NDC的合适焦距。

投影矩阵第三列中的非零值用于映射 OpenGL 中的 z 值,因此我们可以忽略它们。

K矩阵中的k,l是mm/px的比值,如果我们使用pybullet我们可以说k=l=1。

一些有用的资源是 [1] , [2][3] .

关于python - 从 pybullet 了解 View 和投影矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60430958/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com