Tengo una tarea en la que tengo que calcular y trazar algunos puntos usando una transformación pespectiva, pero no estoy seguro de que mis resultados sean correctos, ya que la trama 3D con coordenadas de cámara se ve muy diferente de la trama 2d con las coordenadas de la imagen . ¿Me pueden ayudar a entender qué pasa?
Esto es lo que se da: la cámara está en el punto W T C = [ - 1 , 1 , 5 ] T , especificada en coordenadas mundiales (en metros). El sistema de coordenadas de la cámara gira alrededor del eje Y de la referencia mundial en θ = 160 o , por lo que su matriz de rotación es w R c = [ c o s ( θ ) 0 s i n ( θ ) 0 1 0 - s i n (
Los parámetros de la cámara son: , s x = s y = 0.01 m m / p x , o x = 320 p x , o y = 240 p x
Puntos de muestra (en coordenadas mundiales):
Tengo que calcular y trazar los puntos en las coordenadas de la cámara y en las coordenadas de la imagen, así que escribí el siguiente código en 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()
Y estas son las tramas que obtuve del guión: esperaba que fueran algo similares, pero no lo parecen.
Trazar en coordenadas de cámara
Trazar en coordenadas de imagen
fuente
Respuestas:
Identificar sus ejes en ambas figuras y agregar la posición de la cámara a su primera figura lo ayudaría a comprender lo que está sucediendo.
Una buena manera de verificar su respuesta es utilizando un modelador 3D existente como Blender: tenga cuidado con el sistema de coordenadas de Blender, por ejemplo, el vector de cámara predeterminado es
[0, 0, -1]
. Aquí está el render: Focal se estableció en otro valor para hacer que la esfera sea más visible. Entonces vemos que los dos puntos inferiores están en la fila central de la imagen y los puntos están ligeramente a la derecha de la imagen.Implementé tu tarea en Python:
Esto me da esas cifras: respectivamente: coordenadas mundiales, coordenadas de la cámara, coordenadas de la cámara giradas para ajustarse ligeramente a la orientación de la cámara (tenga en cuenta que aquí el vector de la cámara va hacia el punto de vista de la figura, no "ingresa" la figura) y las coordenadas de la imagen.
Entonces, vemos que las coordenadas verticales para los puntos inferiores están correctamente en la fila central (240) y los puntos están en el lado derecho de la imagen (valor horizontal> 320).
-f/Sxy
fuente