2011-05-13 18 views
13

Estoy usando Matlab para la calibración de la cámara usando Jean- Yves Bouget's Camera Calibration Toolbox. Tengo todos los parámetros de la cámara del procedimiento de calibración. Cuando utilizo una imagen nueva que no es en el conjunto de calibración, puedo obtener su ecuación de transformación, p. Xc = R * X + T, donde X es el punto 3D del equipo de calibración (planar) en el marco mundial, y Xc sus coordenadas en el marco de la cámara. En otras palabras, , tengo todo (tanto parámetros extrínsecos como intrínsecos).¿Cómo hacer la corrección de perspectiva en Matlab a partir de parámetros intrínsecos y extrínsecos conocidos?

Lo que quiero hacer es realizar una corrección de perspectiva en esta imagen es decir, quiero que elimine cualquier perspectiva y ver la plataforma de calibración sin distorsión (es un tablero de ajedrez).

nueva caja de herramientas de Visión por Computador de Matlab tiene un objeto que realiza una transformación de perspectiva en una imagen , dada una matriz de 3X3 H. El problema es que no puedo calcular esta matriz partir de los parámetros intrínsecos y extrínsecos conocidos!

+0

También me gustaría saber la respuesta a esto. Siento que puede haber alguna pista en este documento: http://webee.technion.ac.il/~lihi/Publications/ZelnikIrani.Homogs.pami.pdf, aunque no he tenido tiempo de leerlo y digerirlo. – n00dle

Respuesta

1

Enfoque 1: En la Caja de herramientas de calibración de la cámara, debe observar que hay una matriz H para cada imagen de su tablero de ajedrez en su área de trabajo. Todavía no estoy familiarizado con la caja de herramientas de visión por computadora, pero tal vez esta sea la matriz que necesita para su función. Parece que H se calcula así:

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

Enfoque 2: Si la función de caja de herramientas de visión por ordenador no funciona para usted entonces para encontrar la proyección futura de una imagen que he utilizado la función interp2 como tal :

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

he utilizado las proyecciones posibles en un proyecto hace un tiempo y creo que es necesario utilizar coordenadas homogéneas. Creo que encontré this artículo de la wikipedia bastante útil.

4

Para todos los que siguen interesados ​​en esto después de tantos meses, he logrado obtener la matriz de homografía correcta usando el código de Kovesi (http://www.csse.uwa.edu.au/~pk/research/matlabfns), y especialmente la función homography2d.m. Sin embargo, necesitará los valores de píxel de las cuatro esquinas del equipo. Si la cámara se fija de manera constante, entonces tendrá que hacer esto una vez. Vea el código de ejemplo a continuación:

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

Eso debería hacer el truco. Tenga en cuenta que Matlab define el eje x en una imagen y el índice de filas e y como las columnas. Por lo tanto, uno debe intercambiar x-y en las ecuaciones (como probablemente verá en el código anterior). Además, había logrado calcular la matriz de homografía solamente a partir de los parámetros, pero el resultado fue levemente apagado (tal vez errores de redondeo en la caja de herramientas de calibración). La mejor manera de hacerlo es lo anterior.

Si desea utilizar solo los parámetros de la cámara (es decir, no use el código de Kovesi), entonces la matriz de Homografía es H = KK * Rmat * inv_KK. En este caso, el código es,

% 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: ¡He publicado la pregunta con una cuenta no registrada, la he respondido con otra cuenta no registrada y tengo una registrada con math.stackexchange! Sería bueno si alguien unificara los tres. – Jorge

Cuestiones relacionadas