3D点投影到2D后,如何回到3D?
After projecting 3D points to 2D, how to get back to 3D?
简单问题:我使用平移和旋转矩阵以及相机内在矩阵得到一个 3x4 矩阵,用于将 3d 点转换为 2d 点(表示为 Tform)
我用矩阵对点[10,-5,1]进行了变换,在末尾加1,新点记为newpoint。
现在我想使用新点数据转换回 3D space,其中 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 行添加到 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
相乘时,结果的第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
中减去Tform
的第4列,并将结果乘以[=13=的左3x3sub-matrix的倒数],但这有点繁琐,所以我们不妨让 numpy
做更多的工作 :)
简单问题:我使用平移和旋转矩阵以及相机内在矩阵得到一个 3x4 矩阵,用于将 3d 点转换为 2d 点(表示为 Tform)
我用矩阵对点[10,-5,1]进行了变换,在末尾加1,新点记为newpoint。
现在我想使用新点数据转换回 3D space,其中 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 行添加到 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
相乘时,结果的第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
中减去Tform
的第4列,并将结果乘以[=13=的左3x3sub-matrix的倒数],但这有点繁琐,所以我们不妨让 numpy
做更多的工作 :)