【问题标题】:After projecting 3D points to 2D, how to get back to 3D?将 3D 点投影到 2D 后,如何回到 3D?
【发布时间】:2019-06-06 18:18:24
【问题描述】:

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

我将点[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)

【问题讨论】:

    标签: camera linear-algebra projection


    【解决方案1】:

    将值为0 0 0 1 的第四行添加到Tform,即单位矩阵的最后一行:

    >>> 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 列,然后将结果乘以 Tform 的左 3x3 子矩阵的倒数,但这有点繁琐,所以我们不妨让numpy 做更多的工作:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 2010-09-12
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多