将 3D 点投影到 2D 后,如何返回 3D



简单的问题:我使用平移和旋转矩阵以及相机内联矩阵来获取用于将 3d 点转换为 2d 点的 3x4 矩阵(标记为 Tform(

我用矩阵转换了点 [10,-5,1],在末尾添加一个,新点被标记为新点。

现在我想使用新点数据转换回 3D 空间,其中old_est应该等于旧空间。

我正在寻找在下面的代码中插入 XXX 矩阵的解决方案

import numpy as np
Tform=np.array([[4000,0,-1600,-8000],[500,5000,868,-8000],[.5,0,.8,-8]])
old=np.array([10,-5,1,1])
newpoint=np.dot(Tform,old)
print(newpoint)
old_est=np.dot(XXX,np.append(newpoint,1))
print(old_est)

添加第 4 行以Tform0 0 0 1,即单位矩阵的最后一行:

>>> m = np.vstack(Tform, np.array([0,0,0,1]))
>>> m
array([[ 4.00e+03,  0.00e+00, -1.60e+03, -8.00e+03],
       [ 5.00e+02,  5.00e+03,  8.68e+02, -8.00e+03],
       [ 5.00e-01,  0.00e+00,  8.00e-01, -8.00e+00],
       [ 0.00e+00,  0.00e+00,  0.00e+00,  1.00e+00]])

请注意,不能使用 append,因为它也会展平输入数组。

观察,当乘以 old 时,结果的第 4 分量为 1,即结果等于 np.append(newpoint, 1)

>>> np.dot(m, old)
array([ 3.0400e+04, -2.7132e+04, -2.2000e+00,  1.0000e+00])
                                               ----------

因此,XXX是这个新矩阵的矩阵:

>>> XXX = np.linalg.inv(m)
>>> np.dot(XXX, np.append(newpoint, 1))
array([10., -5.,  1.,  1.])
       -------------

我们拿回了old的组件。

或者,您可以从newpoint中减去第 4 列Tform,然后将结果乘以左 3x3 子矩阵的倒数 Tform ,但这有点繁琐,所以我们不妨让numpy做更多的工作:)

相关内容

  • 没有找到相关文章

最新更新