對於所有在這麼多個月後仍然對此感興趣的人,我設法使用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
我也想知道這個答案。我覺得在這篇論文中可能會有一些線索:http://webee.technion.ac.il/~lihi/Publications/ZelnikIrani.Homogs.pami.pdf,儘管我沒有時間閱讀和消化它。 – n00dle 2011-05-13 10:00:56