/ / Matlab विखंडन निकालने के लिए कैमरा प्रोजेक्शन मैट्रिक्स स्थिति और रोटेशन - matlab, मैट्रिक्स, कैमरा, प्रक्षेपण, अंशांकन

मैटलैब विच्छेदन कैमरा प्रोजेक्शन मैट्रिक्स को स्थिति और रोटेशन में निकालने - मैटलैब, मैट्रिक्स, कैमरा, प्रक्षेपण, अंशांकन

मुझे ज्ञात निर्देशांक के साथ अंतरिक्ष में 6 अंक हैंमिमी में और छवि में इसी 2 डी पिक्सेल निर्देशांक (छवि का आकार 640x320 पिक्सेल है और अंक निर्देशांक छवि के ऊपरी भाग से मापा गया है। मेरे पास कैमरे की फोकल लंबाई 43.456 मिमी है) कैमरा स्थिति और अभिविन्यास खोजने की कोशिश कर रहा है। । यहाँ मेरा matlab कोड मुझे -572.8052 कैमरा स्थान देगा -676.7060 548.7718 और सही लगता है, लेकिन मुझे ओरिएंटेशन वैल्यू (डिग्री में कैमरे का याग पिच रोल) खोजने में मुश्किल समय आ रहा है मुझे पता है कि रोटेशन मान 60.3,5.6, -45.1 होना चाहिए मेरे कोड में अंतिम 4 पंक्तियों को कैमरे के उन्मुखीकरण को अपडेट करने के लिए अद्यतन करने की आवश्यकता है। मैं वास्तव में इस पर आपकी मदद की सराहना करूंगा। धन्यवाद।

यहाँ मेरा matlab कोड है:

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 № 1

पहली बात पहले: 6 अंक पर्याप्त हैं लेकिन यह संभावना है कि आपके पास कुछ त्रुटि है। एक बेहतर प्रदर्शन प्राप्त करने के लिए, 6 से अधिक बिंदुओं की सिफारिश की जाती है, जैसे 10-15 अधिमानतः।

आपका कोड तब तक सही लगता है:

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

तो आप कैमरे के बाहरी और आंतरिक मापदंडों की तलाश कर रहे हैं, अर्थात्। rotation, translation, alpha(x दिशा में तिरछा), ro, beta(x दिशा में तिरछा), u0, v0 (कैमरा सेंटर का अनुवाद)। तो कुल 5 आंतरिक, 6 बाहरी पैरामीटर।

यहां है संपर्क जो उन मापदंडों की गणना करने के तरीके का विवरण देता है। मेरे पास एक कोड था जो मैंने पूरी तरह से परीक्षण नहीं किया था, कुछ त्रुटियां हो सकती हैं लेकिन यह मेरे मामले में काम कर रहा था।

से जारी है M जो 3x4 मैट्रिक्स आपको मिला है:

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

कहा पे

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

मैं डॉन 'टी गारंटी यह पूरी तरह से सही है, लेकिन यह मदद करनी चाहिए।