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

时间:2019-06-06 18:18:24

标签: camera linear-algebra projection

一个简单的问题:我使用平移和旋转矩阵以及相机内在函数矩阵来获得3x4矩阵,该矩阵用于将3d点转换为2d点(表示为Tform)

我通过在矩阵的末尾加1来变换点[10,-5,1],并将新点记为newpoint。

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

我正在寻找下面的代码插入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)

1 个答案:

答案 0 :(得分:0)

Tform的第四行中添加值0 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时,结果的第四部分为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的组件取回来。

或者,您可以从Tform中减去newpoint的第四列,然后将结果与Tform的左3x3子矩阵的逆矩阵相乘,但这有点因此,我们最好还是让numpy做更多的工作:)