2011-05-13 47 views
13

我使用Matlab進行攝像機標定,使用Jean- Yves Bouget's Camera Calibration Toolbox。我有來自校準程序的所有相機 參數。當我在校準集中使用不是 的新圖像時,我可以得到其轉換方程,例如 Xc = R * X + T,其中X是世界座標系中的校準裝備(平面)的3D點,Xc是相機座標系中的座標。在其他 的話,我有一切(外在和內在參數)。如何從已知的固有參數和外部參數在Matlab中進行透視校正?

我想要做的是對此圖像執行透視校正 即我希望它可以去除任何透視圖並看到未畸變的校正裝置(其棋盤格) 。

Matlab的新計算機視覺工具箱有一個對象,在給定3X3矩陣H的情況下對 圖像執行透視變換。問題是,我無法從已知的內在和外在參數計算這個矩陣!

+0

我也想知道這個答案。我覺得在這篇論文中可能會有一些線索:http://webee.technion.ac.il/~lihi/Publications/ZelnikIrani.Homogs.pami.pdf,儘管我沒有時間閱讀和消化它。 – n00dle 2011-05-13 10:00:56

回答

1

方法1: 在相機校準工具箱中,您應該注意到工作區中棋盤的每個圖像都有一個H矩陣。我對計算機視覺工具箱還不熟悉,但也許這是您的功能需要的矩陣。看來,H爲計算像這樣:

KK = [fc(1) fc(1)*alpha_c cc(1);0 fc(2) cc(2); 0 0 1]; 
H = KK * [R(:,1) R(:,2) Tc]; % where R is your extrinsic rotation matrix and Tc the translation matrix 
H = H/H(3,3); 

方法2: 如果計算機視覺工具箱功能不適用於你的工作,然後找到一個圖像的預期投射我已經使用了interp2功能,像這樣:

[X, Y] = meshgrid(0:size(I,2)-1, 0:size(I,1)-1); 
im_coord = [X(:), Y(:), ones(prod(size(I_1)))]'; 
% Insert projection here for X and Y to XI and YI 
ZI = interp2(X,Y,Z,XI,YI); 

我前段時間對項目使用了預期投影,我相信你需要使用齊次座標。我想我發現this維基百科文章相當有幫助。

4

對於所有在這麼多個月後仍然對此感興趣的人,我設法使用Kovesi的代碼(http://www.csse.uwa.edu.au/~pk/research/matlabfns),尤其是單應性2d.m函數得到了正確的單應性矩陣。然而,您將需要鑽機四個角落的像素值。如果相機固定不動,那麼您需要做一次。請參閱下面的示例代碼:

%get corner pixel coords from base image 
p1=[33;150;1]; 
p2=[316;136;1]; 
p3=[274;22;1]; 
p4=[63;34;1]; 
por=[p1 p2 p3 p4]; 
por=[0 1 0;1 0 0;0 0 1]*por; %swap x-y <-------------------- 

%calculate target image coordinates in world frame 
% rig is 9x7 (X,Y) with 27.5mm box edges 
XXw=[[0;0;0] [0;27.5*9;0] [27.5*7;27.5*9;0] [27.5*7;0;0]]; 
Rtarget=[0 1 0;1 0 0;0 0 -1]; %Rotation matrix of target camera (vertical pose) 
XXc=Rtarget*XXw+Tc_ext*ones(1,4); %go from world frame to camera frame 
xn=XXc./[XXc(3,:);XXc(3,:);XXc(3,:)]; %calculate normalized coords 
xpp=KK*xn; %calculate target pixel coords 

% get homography matrix from original to target image 
HH=homography2d(por,xpp); 
%do perspective transformation to validate homography 
pnew=HH*por./[HH(3,:)*por;HH(3,:)*por;HH(3,:)*por]; 

這應該做的伎倆。請注意,Matlab定義了圖像中的x軸和行索引,y定義爲列。因此,必須在方程中交換x-y(正如您在上面的代碼中可能會看到的那樣)。此外,我已經成功地從參數中計算了單應矩陣,但結果稍微偏離了一點(可能是校準工具箱中的舍入誤差)。做到這一點的最佳方式就是上述。

如果您只想使用相機參數(即不使用Kovesi的代碼),則Homography矩陣爲H = KK * Rmat * inv_KK。在這種情況下代碼是,

% corner coords in pixels 
p1=[33;150;1]; 
p2=[316;136;1]; 
p3=[274;22;1]; 
p4=[63;34;1]; 
pmat=[p1 p2 p3 p4]; 
pmat=[0 1 0;1 0 0;0 0 1]*pmat; %swap x-y 

R=[0 1 0;1 0 0;0 0 1]; %rotation matrix of final camera pose 
Rmat=Rc_ext'*R; %rotation from original pose to final pose 
H=KK*Rmat*inv_KK; %homography matrix 
pnew=H*pmat./[H(3,:)*pmat;H(3,:)*pmat;H(3,:)*pmat]; %do perspective transformation 

H2=[0 1 0;-1 0 0;0 0 1]*H; %swap x-y in the homography matrix to apply in image 
+0

@主持人:我發佈了一個未註冊帳戶的問題,用另一個未註冊的帳戶回答了問題,並使用math.stackexchange註冊了一個帳戶!如果有人能夠統一三者,我會很高興。 – Jorge 2012-01-05 12:40:46