2016-06-08 10 views
1

I Kamerakalibrierung in Matlab verwenden, um einige Schachbrettmuster zu erkennen, nachTransformation der Kamerakalibrierungsmuster

figure; showExtrinsics(cameraParams, 'CameraCentric'); 

enter image description here

Nun möchte ich die Schachbrettmuster um die x-Achse drehen, so dass alle von ihnen haben fast die gleichen y-Koordinaten im Kamerarahmen.

Methode: Ich bekomme die Positionen aller Muster im Rahmen der Kamera. Dann mache ich Optimierung, wo die Zielfunktion ist Varianz in y zu minimieren und die Variable ist Drehung um x von 0 bis 360.

Problem: Aber wenn ich die transformierten Y-Koordinaten plotten, sind sie sogar fast in eine Linie.

Code:

Holen Sie sich die checkerboad Punkte:

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

Daten (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] 

Hauptcode (Optimierung und 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

Erwägen Sie, die Antwort zu akzeptieren, wenn es Ihnen geholfen hat –

Antwort

1

Dies ist ein klares Ei Genvector Problem!

Nehmen Sie Zentroide:

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 auf sie, damit wir wissen, die wichtigsten conponents:

[R]=pca(t_cw); 

Und .... das ist es! R ist jetzt die Transformationsmatrix zwischen Ihren ursprünglichen Punkten und dem gedrehten Koordinatensystem. Als Beispiel werde ich in rot die alten Punkten und in blau die neuen zeichnen:

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

Sie können sehen, dass jetzt die blauen in einem Flugzeug, mit dem bestmöglichen Sitz zu die X Richtung. Wenn Sie sie in Y-Richtung wollen, drehen Sie einfach um 90 Grad in Z (Ich bin sicher, dass Sie herausfinden können, wie man das mit 2 Minuten von Google macht;)).

Hinweis: Dies ist mathematisch die bestmögliche Passform. Ich weiß, dass sie nicht so "in einer Reihe" sind, wie man möchte, aber das liegt an den Daten, das ist ehrlich gesagt die bestmögliche Anpassung, denn das sind die Eigenvektoren!