14

我正在使用 Matlab 使用Jean-Yves Bouget 的相机校准工具箱进行相机校准。我有校准过程中的所有相机参数。当我使用不在校准集中的新图像时,我可以得到它的变换方程,例如 Xc=R*X+T,其中 X 是世界框架中校准装置(平面)的 3D 点,Xc 是它的坐标相机框架。换句话说,我拥有一切(外在参数和内在参数)。

我想要做的是对此图像执行透视校正,即我希望它移除任何透视并看到校准装置不失真(它是一个棋盘)。

Matlab 的新计算机视觉工具箱有一个对象,它对图像执行透视变换,给定一个 3X3 矩阵 H。问题是,我无法从已知的内在和外在参数计算这个矩阵!

4

2 回答 2

4

对于这么多月后仍然对此感兴趣的所有人,我已经设法使用 Kovesi 的代码(http://www.csse.uwa.edu.au/~pk/research/matlabfns)获得了正确的单应矩阵,并且特别是homography2d.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 定义为列。因此,必须在方程式中交换 xy(您可能会在上面的代码中看到)。此外,我已经设法仅从参数计算单应矩阵,但结果略有偏差(可能是校准工具箱中的舍入误差)。最好的方法是上面的。

如果只想使用相机参数(即不要使用 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
于 2012-01-05T03:12:21.040 回答
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);

前段时间我在一个项目上使用过前瞻性投影,我相信你需要使用齐次坐标。我想我发现这篇维基百科文章很有帮助。

于 2011-07-15T19:48:52.227 回答