2016-06-08 4 views
1

J'utilise le calibrage de la caméra dans Matlab pour détecter certains motifs de damiers, aprèstransformation des modèles d'étalonnage de l'appareil

figure; showExtrinsics(cameraParams, 'CameraCentric'); 

enter image description here

Maintenant, je veux tourner les motifs de damiers autour de l'axe des x tels que tous ont presque les mêmes coordonnées y dans le cadre de la caméra.

Méthode: Je reçois les positions de tous les motifs dans le cadre de la caméra. Ensuite, je fais l'optimisation, où la fonction objective est de minimiser la variance en y et la variable est la rotation autour de x allant de 0 à 360.

Problème: Mais quand je trace les coordonnées y transformées, elles sont même presque en une ligne.

Code:

Obtenez les points de checkerboad:

%% Get rotation and translation matrices for each image; 
T_cw=cell(num_imgs,1); % stores camera to world rotation and translation for each image 
pixel_coordinates=zeros(num_imgs,2); % stores the pixel coordinates of each checkerboard origin 
for ii=1:num_imgs, 
    % Calibrate the camera 
    im=imread(list_imgs_path{ii}); 
    [imagePoints, boardSize] = detectCheckerboardPoints(im); 
    [r_wc, t_wc] = extrinsics(imagePoints, worldPoints, cameraParams); 
    T_wc=[r_wc,t_wc';0 0 0 1]; 
    % World to camera matrix 
    T_cw{ii} = inv(T_wc); 
    t_cw{ii}=T_cw{ii}(1:3,4); % x,y,z coordinates in camera's frame 
end 

données (num_imgs = 10):

t_cw 
[-1072.01388542262;1312.20387622761;-1853.34408157349] 
[-1052.07856598756;1269.03455126794;-1826.73576892251] 
[-1091.85978641218;1351.08261414473;-1668.88197803184] 
[-1337.56358084648;1373.78548638383;-1396.87603554914] 
[-1555.19509876309;1261.60428874489;-1174.63047408086] 
[-1592.39596647158;1066.82210015055;-1165.34417772659] 
[-1523.84307918660;963.781819272748;-1207.27444716506] 
[-1614.00792252030;893.962075837621;-1114.73528985018] 
[-1781.83112607964;708.973204727939;-797.185326205240] 
[-1781.83112607964;708.973204727939;-797.185326205240] 

code principal (optimisation et de transformation):

%% Get theta for rotation 
f_obj = @(x)var_ycors(x,t_cw); 
opt_theta = fminbnd(f_obj,0,360); 
%% Plotting (rotate ycor and check to fix theta) 
y_rotated=zeros(1,num_imgs); 
for ii=1:num_imgs, 
    y_rotated(ii)=rotate_cor(opt_theta,t_cw{ii}); 
end 
plot(1:numel(y_rotated),y_rotated); 


function var_computed=var_ycors(theta,t_cw) 
ycor=zeros(1,numel(t_cw)); 
for ii =1:numel(t_cw), 
    ycor(ii)=rotate_cor(theta,t_cw{ii}); 
end 
var_computed=var(ycor); 
end 

function ycor=rotate_cor(theta,mat) 
r_x=[1 0 0; 0 cosd(theta) -sind(theta); 0 sind(theta) cosd(theta)]; 
rotate_mat=mat'*r_x; 
ycor=rotate_mat(2); 
end 
+0

Envisager d'accepter la réponse si cela vous a aidé –

Répondre

1

Ceci est un ei clair problème de genvector!

Prenez votre centroïdes:

t_cw=[-1072.01388542262;1312.20387622761;-1853.34408157349 
-1052.07856598756;1269.03455126794;-1826.73576892251 
-1091.85978641218;1351.08261414473;-1668.88197803184 
-1337.56358084648;1373.78548638383;-1396.87603554914 
-1555.19509876309;1261.60428874489;-1174.63047408086 
-1592.39596647158;1066.82210015055;-1165.34417772659 
-1523.84307918660;963.781819272748;-1207.27444716506 
-1614.00792252030;893.962075837621;-1114.73528985018 
-1781.83112607964;708.973204727939;-797.185326205240 
-1781.83112607964;708.973204727939;-797.185326205240]; 
t_cw=reshape(t_cw,[3,10])'; 

Compute PCA sur eux, donc nous savons que les principaux conponents:

[R]=pca(t_cw); 

Et .... thats it! R est maintenant la matrice de transformation entre vos points d'origine et le système de coordonnées pivoté. À titre d'exemple, je tirerai en rouge les anciens points et dans les nouveaux bleus:

hold on 

plot3(t_cw(:,1),t_cw(:,2),t_cw(:,3),'ro') 
trans=t_cw*R; 
plot3(trans(:,1),trans(:,2),trans(:,3),'bo') 

enter image description here

Vous pouvez voir que maintenant les bleus sont dans un plan, avec le meilleur ajustement possible la direction X. Si vous les voulez dans la direction Y, il suffit de faire pivoter 90 degrés dans Z (je suis sûr que vous pouvez comprendre comment faire cela avec 2 minutes de Google;)).

Note: C'est mathématiquement le meilleur ajustement possible. Je sais qu'ils ne sont pas aussi "en rang" qu'on le voudrait, mais c'est à cause des données, c'est honnêtement le meilleur ajustement possible, car c'est ce que sont les vecteurs propres!