2011-05-13 5 views
13

J'utilise Matlab pour l'étalonnage de la caméra en utilisant Jean- Yves Bouget's Camera Calibration Toolbox. J'ai tous les paramètres de la caméra de la procédure d'étalonnage. Lorsque j'utilise une nouvelle image non dans l'ensemble d'étalonnage, je peux obtenir son équation de transformation par ex. Xc = R * X + T, où X est le point 3D du banc d'étalonnage (planaire) en le cadre du monde, et Xc ses coordonnées dans le cadre de la caméra. Dans d'autres mots, j'ai tout (paramètres extrinsèques et intrinsèques). Ce que je veux faire est d'effectuer une correction de perspective sur cette image , c'est-à-dire que je veux enlever toute perspective et voir la plate-forme d'étalonnage non déformée (c'est un damier).Comment faire une correction de perspective dans Matlab à partir de paramètres intrinsèques et extrinsèques connus?

nouvelle boîte à outils de vision informatique de Matlab a un objet qui effectue une transformation en perspective sur une image , étant donné une matrice 3x3 H. Le problème est, je ne peux pas calculer cette matrice à partir des paramètres intrinsèques et extrinsèques connus!

+0

Je voudrais également connaître la réponse à cette question. Je pense qu'il pourrait y avoir quelques indices dans ce document: http://webee.technion.ac.il/~lihi/Publications/ZelnikIrani.Homogs.pami.pdf, bien que je n'ai pas eu le temps de le lire et de le digérer. – n00dle

Répondre

1

Approche 1: Dans la boîte à outils de calibrage de la caméra, vous remarquerez qu'il existe une matrice H pour chaque image de votre damier dans votre espace de travail. Je ne connais pas encore la boîte à outils de vision par ordinateur, mais c'est peut-être la matrice dont vous avez besoin pour votre fonction. Il semble que H est calculé comme ceci:

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); 

Approche 2: Si la fonction de boîte à outils de vision par ordinateur ne fonctionne pour vous alors de ne pas trouver la projection prospective d'une image que je l'ai utilisé la fonction interp2 comme si :

[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); 

J'ai utilisé des projections prospectives sur un projet il y a un certain temps et je crois que vous devez utiliser des coordonnées homogènes. Je pense que j'ai trouvé l'article wikipedia this très utile.

4

Pour tous ceux qui sont encore intéressés par cette question après tant de mois, j'ai réussi à obtenir la bonne matrice d'homographie en utilisant le code de Kovesi (http://www.csse.uwa.edu.au/~pk/research/matlabfns), et en particulier la fonction homography2d.m. Vous aurez cependant besoin des valeurs de pixels des quatre coins de la plate-forme. Si la caméra est fixe, vous devrez le faire une fois. Voir l'exemple de code ci-dessous:

%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]; 

Cela devrait faire l'affaire. Notez que Matlab définit l'axe des x dans une image et l'index des lignes et y comme les colonnes. Il faut donc permuter x-y dans les équations (comme vous le verrez probablement dans le code ci-dessus). De plus, j'avais réussi à calculer uniquement la matrice d'homographie à partir des paramètres, mais le résultat était légèrement décalé (peut-être des erreurs d'arrondi dans la boîte à outils d'étalonnage). La meilleure façon de le faire est la suivante.

Si vous voulez utiliser uniquement les paramètres de la caméra (n'utilisez pas le code de Kovesi), alors la matrice Homographie est H = KK * Rmat * inv_KK. Dans ce cas, le code est,

% 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

@Moderators: J'ai posté la question avec un compte non enregistré, y ai répondu avec un autre compte non enregistré et j'en ai enregistré un avec math.stackexchange! Je serais bien si quelqu'un unifierait les trois. – Jorge

Questions connexes