J'ai des devoirs dans lesquels je dois calculer et tracer certains points à l'aide d'une transformation en perspective, mais je ne suis pas sûr que mes résultats soient corrects, car le tracé 3D utilisant les coordonnées de la caméra est très différent du tracé 2D utilisant les coordonnées de l'image . Pouvez-vous m'aider à comprendre ce qui ne va pas?
Voici ce qui est donné: La caméra est au point , spécifié en coordonnées mondiales (en mètres). Le système de coordonnées de la caméra tourne autour de l'axe Y de la référence mondiale de , donc sa matrice de rotation est θ = 160 o w R c = [ c o s ( θ ) 0 s i n ( θ ) 0 1 0 - s i n ( θ ) 0 c o s ( θ ) ]
Les paramètres de l'appareil photo sont: , , ,s x = s y = 0,01 m m / p x o x = 320 p x o y = 240 p x
Exemples de points (en coordonnées mondiales):
Je dois calculer et tracer les points en coordonnées de caméra et en coordonnées d'image, j'ai donc écrit le code suivant dans Octave:
%camera intrinsic parameters
f = 16
Sx = 0.01
Sy = 0.01
Ox = 320
Oy = 240
%given points, in world coordinate
wP1 = transpose([1, 1, 0.5])
wP2 = transpose([1, 1.5, 0.5])
wP3 = transpose([1.5, 1.5, 0.5])
wP4 = transpose([1.5, 1, 0.5])
% camera translation matrix
wTc = transpose([-1, 1, 5])
% rotation angle converted to rad
theta = 160 / 180 * pi
%camera rotation matrix
wRc = transpose([cos(theta), 0, sin(theta); 0, 1, 0; -sin(theta), 0, cos(theta)])
%transform the points to homogeneous coordinates
wP1h = [wP1; 1]
wP2h = [wP2; 1]
wP3h = [wP3; 1]
wP4h = [wP4; 1]
%separate each line of the rotation matrix
R1 = transpose(wRc(1 , :))
R2 = transpose(wRc(2 , :))
R3 = transpose(wRc(3 , :))
%generate the extrinsic parameters matrix
Mext = [wRc, [-transpose(R1) * wTc; -transpose(R2) * wTc; -transpose(R3) * wTc]]
%intrinsic parameters matrix
Mint = [-f/Sx, 0, Ox; 0, -f/Sy, Oy; 0, 0, 1]
% calculate coordinates in camera coordinates
cP1 = wRc * (wP1 - wTc)
cP2 = wRc * (wP2 - wTc)
cP3 = wRc * (wP3 - wTc)
cP4 = wRc * (wP4 - wTc)
% put coordinates in a list for plotting
x = [cP1(1), cP2(1), cP3(1), cP4(1), cP1(1)]
y = [cP1(2), cP2(2), cP3(2), cP4(2), cP1(2)]
z = [cP1(3), cP2(3), cP3(3), cP4(3), cP1(3)]
%plot the points in 3D using camera coordinates
plot3(x, y, z, "o-r")
pause()
% calculate the points in image coordinates
iP1 = Mint * (Mext * wP1h)
iP2 = Mint * (Mext * wP2h)
iP3 = Mint * (Mext * wP3h)
iP4 = Mint * (Mext * wP4h)
%generate a list of points for plotting
x = [iP1(1) / iP1(3), iP2(1) / iP2(3), iP3(1) / iP3(3), iP4(1) / iP4(3), iP1(1) / iP1(3)]
y = [iP1(2) / iP1(3), iP2(2) / iP2(3), iP3(2) / iP3(3), iP4(2) / iP4(3), iP1(2) / iP1(3)]
plot(x, y, "o-r")
pause()
Et ce sont les intrigues que j'ai du script: je m'attendais à ce qu'elles soient quelque peu similaires, mais elles ne le semblent pas.
Tracer les coordonnées de la caméra
Tracer en coordonnées d'image