2014-12-02 125 views
1

我正在研究PIV工作流,目前我正在預處理圖像。我需要擺脫圖像中的透視失真。我確實有「圖像處理工具箱」和「攝像機校準器」。我已經用「undistortImage()」擺脫了鏡頭扭曲;「以及通過棋盤圖案推斷的cameraParams對象。用Matlab的「camerParams」(計算機視覺系統工具箱)糾正圖像

第一個問題:是否可以使用cameraParams對象來透視圖像,以便我的棋盤在圖像中被糾正?

第二個問題:由於我無法使用cameraParams對象,因此我嘗試手動使用轉換函數。我嘗試使用控制點對(使用cpselection工具,原始圖像和生成的棋盤圖像)和fitgeotrans(移動點,固定點,「投影」);函數來獲得我的tform對象。不過,我總是得到錯誤信息:

Error using fitgeotrans>findProjectiveTransform (line 189) 
At least 4 non-collinear points needed to infer projective transform. 
Error in fitgeotrans (line 102) 
     tform = findProjectiveTransform(movingPoints,fixedPoints); 

我嘗試了很多不同對控制點(4對或更多)。但我仍然收到這個錯誤。我相信我必須在這裏忽略一些東西。

任何幫助表示讚賞,謝謝。

斯蒂芬

+0

**第一個問題**:獲得cameraParams唯一唯一的原因是爲了讓圖片清爽。因此它不僅可能,而且是「強制性的」。 **第二個**:好像看起來你給的這些屁股是在一條線上,而且它們應該是非共線的! – 2014-12-02 15:54:25

+0

謝謝。 1 .: 是的,這也是我的想法。爲了獲得鏡頭失真,Matlab必須在內部做一些透視校正。但是我無法找到一種方法將修正應用於圖像。 「undistortImage()」只是進行鏡頭校正。 2 .:我的點在矩形或菱形中排列,因此實際上不在一條線上。所以這個錯誤讓我有點困惑...... – Stephan 2014-12-02 16:02:50

+0

在這裏你有方程式:http://en.wikipedia.org/wiki/Distortion_%28optics%29 – 2014-12-02 16:03:37

回答

1

如果您使用的是校準圖像中的一個,那麼所有你需要的信息在cameraParams對象。

假設您正在使用校準圖像1,我們將其稱爲I。 首先,undistort圖像:

I = undistortImage(I, cameraParams); 

獲取圖像的外部參數(旋轉和平移):

R = cameraParams.RotationMatrices(:,:,1); 
t = cameraParams.TranslationVectors(1, :); 

然後旋轉和平移組合成一個矩陣:

R(3, :) = t; 

現在計算棋盤和圖像平面之間的單應性:

H = R * cameraParams.IntrinsicMatrix; 

使用單應的逆變換的圖像:

J = imwarp(I, projective2d(inv(H))); 
imshow(J); 

你應該可以看到一個「鳥瞰」視圖中的棋盤。如果您未使用其中一個校準圖像,則可以使用extrinsics函數計算Rt

另一種方法是使用detectCheckerboardPointsgenerateCheckerboardPoints,然後使用fitgeotform來計算單應性。

+0

非常感謝。我只是試了一下,它就像一個魅力。豎起大拇指! – Stephan 2014-12-05 08:26:30