2013-01-17 75 views
2

我想在OpenCV和Python中使用透視扭曲糾正圖像。我知道攝像機的方向(X,Y,Z角度)參照需要變形的平面。我知道最簡單的方法是基於已知點計算單應性矩陣,但是我試圖在信息不可用時做同樣的事情。我正在使用的代碼創建一個旋轉矩陣,然後結合平移矩陣和本徵矩陣。目前代碼僅適用於z軸的操作。任何對x軸和y軸的操縱都會導致圖像奇怪的失真。我將我的代碼放在以下帖子底部的答案上:Perspective Warping in OpenCV based on know camera orientation問題與透視單應

附加的是原始圖像和來自標準單應性法的變形圖像。

Original ImagePerspective Warp

from numpy import * 
import cv 

x = float(0) 
y = float(5) 
z = float(0) 
f = 1 

im = cv.LoadImage("Homography_test.jpg") 
cv.NamedWindow("Distorted") 
cv.NamedWindow("undistorted") 

h, w = cv.GetSize(im) 

x1 = x * (pi/180) 
y1 = y * (pi/180) 
z1 = z * (pi/180) 

# Create a rotation matrix 
R_array = array([[x1], [y1], [z1]]) 
R_Vec = cv.fromarray(R_array) 
R = cv.CreateMat(3, 3, cv.CV_64FC1) 

cv.Rodrigues2(R_Vec, R) 

#Create and combine with translation matrix 
Trans_Mat = array([[[1], [0], [-w/2]], 
        [[0], [1], [-h/2]], 
        [[0], [0], [1]]]) 

Trans_Mat2 = cv.fromarray(Trans_Mat) 
R_T_Mat = dot(R, Trans_Mat2) 

#Create and combine with camera matrix 
Intrinsic_Mat = array([[[f], [0], [w/2]], 
         [[0], [f], [h/2]], 
         [[0], [0], [1]]]) 

Int_Mat = cv.fromarray(Intrinsic_Mat) 
H = dot(Int_Mat, R_T_Mat) 
H2 = cv.fromarray(H) 

persp = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 3) 
cv.WarpPerspective(im, persp, H2) 

cv.ShowImage("Distorted", im) 
cv.ShowImage("undistorted", persp) 

cv.WaitKey(0) 
cv.DestroyWindow("Distorted") 
cv.DestroyWindow("undistorted") 

回答

1

你似乎缺少從我的解決方案這是「向下移動圖像Z軸」我以前做的是線第4步。

//4 
trans(2,2) += image.rows; 

我自己選擇了image.rows,它給了我在示例中使用的旋轉的一個很好的縮放感。因爲你沒有這樣做,所以你的z座標固定爲1.我會想象當你圍繞x和y旋轉時,這是失真的原因,本質上是因爲當它圍繞x或y旋轉時,圖像與攝像機非常接近透視失真很大。沿z軸的平移越大,失真應​​該出現的越小。如果您不希望圖像在沿z軸向下移動時收縮,則只需增加焦距即可。您可能會注意到,在我的示例中,我將焦距設置爲image.rows。

+0

謝謝錘子。在Z軸上移動圖像效果不錯,但調整焦距效果更好。 – eminentCodfish