2014-03-04 31 views
3

我使用从明暗恢复形状,以产生用照相机拍摄的图像的数字地形模型(DTM)。使用Python编写的算法似乎工作得很好,但输出处于倾斜和有点球状,所以我怀疑我需要从DTM中删除透视失真和滚动。下面是DTM的视图:3D矩阵透视变换安装在移动平台

DTM of SfS result 数据可用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版本。

任何想法?

谢谢。

+0

什么都没有?!?! 3天后甚至没有评论?我认为这是一个很容易解决的问题,在这个网站的权威。我可否就以前是否遇到此问题提出意见或寻求解决方案是否有任何优点? – PDF417

回答

2

您可以使用一个4×4的变换矩阵是可逆并允许两者之间的双向改造的探讨坐标你想要的系统。

如果你知道的三个旋转abg,约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]) 

为了有效地使用它,你应该把你的点在2 d阵列,如:

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

然后:

new = T.dot(orig) 

会给你转换点。

+0

非常感谢您的回复,但是我不确定我是否理解“将您的观点放在二维数组中”的位置。我的输出是一个包含来自世界框架的z值的数组,正如您正确指出的那样,我需要转换为相机框架。 那么什么是X0并从“原稿”阵列Y0未来,牢记我的形象不相符以X的尺寸比y的尺寸更大。 – PDF417

+1

再次感谢您的意见。尽管我使用了我的x0,x1 ...和y0,y1 ...矩阵,因为我只有一个z0,z1 ...矩阵,它被重新排列在一维矩阵中在添加x和y之前。 – PDF417