python - 3D矩阵透视变换

标签 python opencv numpy matrix scipy

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

数据可用here如果有人有兴趣尝试一下。

相机以 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 版本的工作。

有什么想法吗?

最佳答案

您可以使用 4 x 4 变换矩阵,它是可逆的,并允许在您想要的两个坐标系之间进行双向变换。

如果知道abg这三个旋转,关于xy , z 分别使用右手法则。 x0, y0, z0 是两个坐标系原点之间的平移。

变换矩阵定义为:

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)

会给你转换后的点。

关于python - 3D矩阵透视变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175385/

相关文章:

python - 如何将代码从 Git 更新到 Docker 容器

python - 如何删除 csv 文件中的整行并将更改保存在同一文件上?

python - 从容器连接到主机服务的示例

python - 尝试使用 CV2 和 numpy 调整图像的大小和形状

opencv - pkg-config 错误

python - numpy:沿新轴扩展数组?

python - 从命名管道读取连续数据

dll - OpenCV:链接错误,无法解析外部符号_cvResize和_cvCvtColor

python-3.x - 如何在标志从 0 变为 1 之前和之后提取行

python - sklearn train_test_split;保留训练集中列中的唯一值