2017-03-04 3 views
1

Ich habe 6 Punkte im Raum mit bekannten Koordinaten in mm und entsprechenden 2D-Pixel-Koordinaten im Bild (Bildgröße ist 640x320 Pixel und Punkte Koordinaten wurden von oben links im Bild gemessen Ich habe auch die Brennweite der Kamera als 43.456 mm versuchen, die Kameraposition und Orientierung zu finden .. Mein Matlab-Code hier wird mir die Kamera-Position als -572.8052 -676.7060 548.7718 und scheint richtig, aber ich habe eine harte Zeit, die Orientierungswerte zu finden (Gierteilung der Kamera in Grad) Ich weiß, dass die Rotationswerte 60,3,5,6, -45,1 sein sollten die letzten 4 Zeilen in meinem Code müssen aktualisiert werden, um die Ausrichtung der Kamera auszugeben. würde ich Ich schätze deine Hilfe wirklich sehr. Danke.Matlab Zerlegen Extrahieren Kamera Projektion Matrix zu Position und Rotation

Hier ist mein Matlab-Code:

Points_2D= [135 183 ; 188 129 ; 298 256 ; 301 43 ; 497 245; 464 110]; 

Points_3D= [-22.987 417.601 -126.543 ; -132.474 37.67 140.702 ; ... 
      388.445 518.635 -574.784 ; 250.015 259.803 67.137 ; ... 
      405.915 -25.566 -311.834 ; 568.859 164.809 -162.604 ]; 


M = [0;0;0;0;0;0;0;0;0;0;0]; 

A = []; 
for i = 1:size(Points_2D,1) 
    u_i = Points_2D(i,1); 
    v_i = Points_2D(i,2); 
    x_i = Points_3D(i,1); 
    y_i = Points_3D(i,2); 
    z_i = Points_3D(i,3); 
    A_vec_1 = [x_i y_i z_i 1 0 0 0 0 -u_i*x_i -u_i*y_i -u_i*z_i -u_i]; % 
    A_vec_2 = [ 0 0 0 0 x_i y_i z_i 1 -v_i*x_i -v_i*y_i -v_i*z_i -v_i]; % 
    A(end+1,:) = A_vec_1; 
    A(end+1,:) = A_vec_2; 
end 

[U,S,V] = svd(A); 
M = V(:,end); 
M = transpose(reshape(M,[],3)); 

Q = M(:,1:3); 
m_4 = M(:,4); 
Center = (-Q^-1)*m_4 


k=[43.456/640 0 320 ;0 43.456/320 160;0 0 1 ]; 
Rotation= (Q^-1)*k; 
CC=Rotation' 
eul=rotm2eul(CC) 
+0

Brauchen Sie noch Hilfe? Oder war es eine Hausaufgabe/ein Projekt, dass du fertig bist? – smttsp

+0

Nein Ich suche immer noch nach einer Lösung und es ist Jahre her, seit ich die Schule verlassen habe! kannst du helfen? – Ali

+0

Was genau suchen Sie? Rotation und Translation der Kamera in Bezug auf eine Position, d. h. (0,0) Kamerakonzentration? – smttsp

Antwort

0

Das erste, was zuerst: 6 Punkte sind genug, aber es ist wahrscheinlich, dass Sie einige Fehler haben. Um eine bessere Leistung zu erzielen, empfiehlt es sich, mehr als 6 Punkte zu haben, vorzugsweise 10-15.

Ihr Code scheint korrekt bis:

Q = M(:,1:3); 
m_4 = M(:,4); 

So suchen Sie extrinsischen und intrinsischen Parameter der Kamera, dh rotation, translation, alpha (Skew in x-Richtung), ro, beta (Skew in x Richtung), u0, v0 (Übersetzung von Kameracenter). Also insgesamt 5 intrinsics, 6 extrinsic Parameter.

Hier ist eine link, die die Details erläutert, wie diese Parameter zu berechnen sind. Ich hatte einen Code, den ich nicht gründlich getestet habe, vielleicht ein paar Fehler, aber es funktionierte in meinem Fall.

Fortsetzung von M die die 3x4 Matrix Sie gefunden:

a1 = M(1, 1:3); 
a2 = M(2, 1:3); 
a3 = M(3, 1:3); 

b = M(1:3,4); 

% Decomposition of the parameters 
eps = 1; %this can be -1 or +1, based on the value you choose, you will have two different results. 
ro = eps/sqrt(sumsqr(a3)); 
r3 = ro*a3; 
u0 = ro.^2*(dot(a1,a3)) 
v0 = ro.^2*(dot(a2,a3)) 

cos_theta = -dot(cross(a1,a3),cross(a2,a3))/ ... 
     dist_cross(a1,a3)/(dist_cross(a2,a3)); 
theta = acos(cos_theta); 
alpha = ro^2*dist_cross(a1,a3)*sin(theta) 
beta = ro^2*dist_cross(a2,a3)*sin(theta) 
theta_deg = theta*180/pi 
r1 = 1/dist_cross(a2,a3)*cross(a2,a3); 
r2 = cross(r3,r1); 
R = [r1;r2;r3] % Rotation matrix 3x3 

% ro*A.inv(R) = K 
K = [alpha -alpha*cot(theta) u0; 
    0  beta/sin(theta) v0; 
    0    0   1 ]; 
T = ro*(inv(K)*b) % Translation matrix, 1x3 

wo

function [dis] = dist_cross(mi,mj) 
    dis = sqrt(sumsqr(cross(mi,mj))); 
end 

Ich garantiere es nicht ganz korrekt ist, aber es sollte helfen.

+1

Ich werde dies testen, wenn ich heute Abend nach Hause komme. Wenn es funktioniert, bist du mein Held. – Ali

+0

Es hat nicht funktioniert. Mein Problem ist einfacher Ich habe keine Verzerrung oder Verzerrung Parameter., Ich kenne auch die Brennweite, die in Ihrem Code nicht sicher, wo es ist .. – Ali

+0

Was ist die Ausgabe oder der Fehler? Skew und Alpha, Beta sind intrinsische Parameter. Wenn Ihre Kamera keinen Schräglauf hat, ist Theta pi/2. Alpha bezieht sich auf die Pixeldichte oder die Länge eines Pixels. – smttsp

Verwandte Themen