2014-03-04 70 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