3D矩阵透视变换

发布于 2021-01-29 15:00:59

我正在使用阴影中的形状生成使用安装在移动平台上的相机拍摄的图像的数字地形模型(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版本。

有任何想法吗?

关注者
0
被浏览
99
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用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)
    

    将为您提供转换点。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看