小编典典

3D矩阵透视变换

python

我正在使用阴影中的形状生成使用安装在移动平台上的相机拍摄的图像的数字地形模型(DTM)。用Python编写的算法似乎运行得很好,但是输出是倾斜的并且有点球形,所以我怀疑我需要从DTM中消除透视失真和桶形。

如果有人对此感兴趣,可以在这里获得数据。

摄像机以41度倾斜安装,并具有以下摄像机和失真矩阵:

    cam_matrix = numpy.matrix([[246.00559,0.00000,169.87374],[0.00000,247.37317,132.21396],[0.00000,0.00000,1.00000]])
    distortion_matrix = numpy.matrix([0.04674, -0.11775, -0.00464, -0.00346, 0.00000])

如何应用透视变换并从此矩阵中消除桶形失真以获得平坦的DTM?

我已经尝试过使用OpenCV进行此操作,但是由于OpenCv期望图像,因此它不起作用,并且变换只是在移动像素而不是操纵它们的值。我还研究了Numpy和Scipy,但尚未得出结论或解决方案。我对这些转换背后的理论有些熟悉,但主要用于2D版本。

有任何想法吗?


阅读 396

收藏
2021-01-20

共1个答案

小编典典

您可以使用4 x 4转换矩阵,该矩阵是不可逆的,并且可以在所需的两个坐标系之间进行双向转换。

如果你知道的三个旋转ab并且g,关于xyz分别采用右手法则。的x0y0z0是两个坐标系的原点的翻译。

转换矩阵定义为:

T = np.array([[ cos(b)*cos(g), (sin(a)*sin(b)*cos(g) + cos(a)*sin(g)), (sin(a)*sin(g) - cos(a)*sin(b)*cos(g)), x0],
              [-cos(b)*sin(g), (cos(a)*cos(g) - sin(a)*sin(b)*sin(g)), (sin(a)*cos(g) + cos(a)*sin(b)*sin(g)), y0],
              [        sin(b), -sin(a)*cos(b), cos(a)*cos(b), z0]
              [ 0, 0, 0, 1])

为了有效地使用它,您应该将点放置在二维数组中,例如:

orig = np.array([[x0, x1, ..., xn],
                 [y0, y1, ..., yn],
                 [z0, z1, ..., zn],
                 [ 1,  1, ...,  1]])

然后:

new = T.dot(orig)

将为您提供转换点。

2021-01-20