我正在使用来自阴影的形状为使用安装在移动平台上的相机拍摄的图像生成数字地形模型 (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 变换矩阵,它是可逆的,并允许在您想要的两个坐标系之间进行双向变换。
如果知道a
、b
和g
这三个旋转,关于x
、y
, 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/