Apuntes / Visión por Computador / Apunte 3 de 6
Read in EnglishTransformaciones 3D
Rotaciones y traslaciones en el espacio, proyección en perspectiva y el modelo de cámara, con figuras interactivas.
M′ = SM
Una matriz de 4 × 4 da las coordenadas de un punto en un nuevo sistema de coordenadas del espacio.
λm = PM
Una matriz de 3 × 4 lo proyecta sobre la imagen.
En esta página, los puntos se dibujan con tinta roja y las rectas con tinta azul. Se basa en los apuntes de coordenadas homogéneas y de transformaciones 2D.
1Un punto en dos sistemas de coordenadas 3D
Un punto del espacio con coordenadas (X, Y, Z) se escribe en coordenadas homogéneas igual que en el plano, agregando un 1:
Ahora toma un segundo sistema de coordenadas, con ejes X′, Y′ y Z′, como si estuviera pegado a un objeto. Se obtiene del primero girando los ejes y moviendo el origen, así que llamaremos al primero el sistema original y al segundo el sistema nuevo. El mismo punto tiene coordenadas M′ = [X′ Y′ Z′ 1]T en el sistema nuevo. Seis números relacionan ambos sistemas: tres ángulos, ωX, ωY y ωZ, para el giro, y tres para la traslación.
La traslación
Si los ejes no están girados y el nuevo origen está en t′ = (t′X, t′Y, t′Z) en el sistema original, cada coordenada original es la nueva más la posición del nuevo origen:
El 1 al final de M′ convierte estas tres sumas en un solo producto de matrices:
La última columna de la matriz se multiplica por ese 1, así que t′ se suma a todos los puntos. Sin la cuarta componente, una traslación no podría escribirse como un producto de matrices, igual que en el plano. En el sentido contrario, las coordenadas nuevas son las originales menos t′.
2Girar en torno a un eje
Gira los ejes en torno a Z en un ángulo ωZ. El eje Z se queda donde está, y X′ e Y′ son X e Y girados en ωZ, medido de X a X′. Los ángulos positivos siguen la regla de la mano derecha: con el pulgar derecho a lo largo del eje, los dedos se curvan en el sentido en que gira un ángulo positivo. Visto desde la punta del eje Z, mirando hacia el origen, un ωZ positivo gira X hacia Y, en sentido antihorario.
Un punto que se queda donde está recibe coordenadas nuevas M′ = RZM, dejando fuera el 1 final, con
Cada coordenada nueva es el largo de la sombra del punto sobre un eje nuevo, es decir, un producto punto con el vector unitario de ese eje. El vector unitario de X′ es (cos ωZ, sin ωZ, 0) en el sistema original, así que X′ = X cos ωZ + Y sin ωZ: la primera fila de RZ. Las filas de RZ son los ejes nuevos, escritos en el sistema original.
RZ puede parecer la traspuesta de la matriz de rotación habitual, que tiene −sin ωZ sobre la diagonal, y lo es. Esa matriz gira puntos; RZ deja quieto el punto y gira los ejes, y girar los ejes en ωZ cambia las coordenadas del punto exactamente como lo haría girar el punto en −ωZ. El mismo par aparece en los apuntes de transformaciones 2D, como R y R′.
Los giros en torno a los otros dos ejes mantienen fijo su propio eje de la misma manera:
En RY el signo menos está sobre la diagonal. La regla de la mano derecha gira Y hacia Z en torno a X, Z hacia X en torno a Y, y X hacia Y en torno a Z, siempre siguiendo el ciclo X → Y → Z → X. En torno a Y, el giro va de Z a X, pero la matriz pone X antes que Z, contra el ciclo, y eso intercambia los dos signos.
3Cualquier rotación a partir de tres ángulos
Girar en torno a los tres ejes se hace un eje a la vez: primero en torno a Z en ωZ, luego en torno al nuevo eje Y en ωY, y luego en torno al eje X más nuevo en ωX. Cada giro vuelve a convertir las coordenadas, a los ejes tal como han quedado, así que las matrices se multiplican de derecha a izquierda:
Para un giro solo, M′ = RM. Al multiplicarlas, cada entrada mezcla senos y cosenos de los tres ángulos. La primera fila, por ejemplo, es
El orden es parte de la definición. Los productos de matrices no conmutan, y los giros en el espacio tampoco: dale a un libro un cuarto de vuelta en torno a un eje y luego en torno a otro, después prueba en el otro orden, y el libro termina mirando hacia otro lado. A los mismos ejes se puede llegar en otro orden, pero con otros ángulos. Girar primero en ωZ = 90° y luego en ωY = −90° da los mismos ejes que girar primero en ωX = 90° y luego en ωZ = 90°: RY(−90°)RZ(90°) = RZ(90°)RX(90°).
Por qué bastan tres números
Una matriz de 3 × 3 tiene nueve entradas, pero una rotación no puede tener nueve cualesquiera. Las filas de R son los vectores unitarios de los ejes nuevos, así que cada una tiene longitud 1 y cada par es perpendicular: tres condiciones para las longitudes y tres para los ángulos rectos, escritas todas a la vez como RRT = I. Nueve entradas menos seis condiciones dejan tres números libres, y tres ángulos bastan para fijarlos. Un espejo también cumple RRT = I, pero convierte una mano derecha en una izquierda; las rotaciones son las matrices que además tienen det R = +1. La misma ecuación dice que la inversa de R es su traspuesta.
Giro y traslación en una sola matriz
Ahora mueve también el origen, a t′ en el sistema original. Para obtener las coordenadas nuevas, resta t′ y gira: M′ = R(M − t′) = RM + t, con t = −Rt′, que es el origen original escrito en el sistema nuevo. En coordenadas homogéneas eso es un solo producto de 4 × 4:
Esta es la transformación euclídea del espacio. Mueve el espacio como una pieza rígida, así que conserva longitudes y ángulos, y tiene seis números libres, donde su equivalente en 2D tiene tres.
De vuelta
Para recuperar las coordenadas originales, deshaz el giro y luego la traslación: M = RTM′ + t′. Escribiendo R′ = RT,
con t′ = −R′t. R′ deshace los tres giros en orden inverso, cada uno con el ángulo opuesto: R′ = RZ(−ωZ)RY(−ωY)RX(−ωX). Sus columnas son los ejes nuevos escritos en el sistema original, así que R′M′ + t′ se lee como la matriz H de los apuntes de 2D: parte en t′, y luego avanza X′ unidades a lo largo del eje X′, Y′ unidades a lo largo de Y′ y Z′ unidades a lo largo de Z′.
Cuando dos ángulos hacen lo mismo
Con ωY = 90°, el giro en torno a Y deja el eje X sobre el eje Z, apuntando en sentido contrario, así que el último giro, en torno a X, ocurre en torno a la misma recta que el primero, en torno a Z. Solo importa la diferencia ωX − ωZ (con −90°, la suma ωX + ωZ), y se pierde uno de los tres números. Esto se llama bloqueo del cardán (gimbal lock), y es una de las razones por las que las rotaciones suelen guardarse de otras formas que tres ángulos, como un eje y un ángulo.
ωX = ° ωY = ° ωZ = °
t′ =
Cambia los ángulos y el origen t′ de la caja, o arrastra el círculo azul hueco, y arrastra el fondo para girar la vista. Los ejes azules X′, Y′ y Z′ son las filas de R, y la esquina roja es M′ = (2, 1, 1) en las coordenadas de la caja. Con el teclado, selecciona la figura, el círculo o un campo con Tab y usa las flechas.
4Proyección en perspectiva
Una cámara convierte puntos del espacio en puntos de una imagen. El modelo más simple es la cámara pinhole, o cámara oscura: cada punto M envía un rayo recto a través de un único punto C, el centro óptico, y la imagen es donde esos rayos cruzan un plano, el plano de imagen. Pon el origen de las coordenadas en C y el eje Z perpendicular al plano de imagen. Ese eje es el eje óptico, y el plano está en Z = f, donde f es la distancia focal. El plano de imagen tiene sus propios ejes x e y, paralelos a X e Y, con su origen donde el eje óptico lo corta, un punto llamado punto principal.
El rayo que va de C a M = (X, Y, Z) corta el plano en m = (x, y). A lo largo del rayo, la distancia al eje óptico crece en proporción a la profundidad: hacia el lado es X a la profundidad Z, y x a la profundidad f. Los dos triángulos rectángulos son semejantes, así que
lo que da Zx = fX y Zy = fY, o x = fX/Z e y = fY/Z. La división por Z es la razón por la que las cosas lejanas se ven pequeñas.
La matriz P
La división también hace que el paso de M a m no sea lineal, así que tal como está no puede ser un producto de matrices. Las coordenadas homogéneas lo resuelven. Escribe las dos ecuaciones, junto con Z = Z, como
El lado izquierdo es un múltiplo de m, y el derecho es una matriz P por M:
El factor λ es la profundidad Z, ya que la tercera fila de P copia Z. Para leer m, divide PM por su tercera componente, como con cualquier vector homogéneo. La división por Z no desapareció; se movió al final, donde ya no estorba a la matriz.
La cámara es el mismo dibujo que las coordenadas homogéneas
Toma f = 1. Entonces x = X/Z e y = Y/Z: dividir por la tercera componente, que es exactamente como se lee un vector homogéneo [p q r]T. El espacio de la cámara es el espacio con ejes p, q y r de los apuntes de coordenadas homogéneas, el centro óptico es su origen, y el plano de imagen es su plano r = 1. Cada punto de la imagen representa un rayo completo que pasa por C, así como cada punto del plano representaba una recta que pasa por el origen.
Eso es también lo que una sola imagen no puede decir: a qué distancia sobre su rayo estaba un punto. M y 2M, el doble de lejos en la misma dirección, dan el mismo m. Recuperar la profundidad requiere una segunda imagen tomada desde otro lugar, donde el mismo punto está sobre un rayo distinto. Los apuntes de geometría epipolar muestran dónde aparece ese rayo en la segunda imagen, y los de múltiples vistas encuentran el punto donde los rayos se cortan.
Un punto no tiene imagen: el centro óptico. P envía C = [0 0 0 1]T al vector cero, que no representa ningún punto, ya que todos los rayos parten de C.
La imagen detrás del centro
En una cámara oscura real, la imagen se forma detrás del orificio, al otro lado de C respecto de la escena, en Z = −f. Los rayos se cruzan en C, así que un punto sobre el eje cae debajo de él y uno a la izquierda cae a la derecha: la imagen queda invertida. Los mismos triángulos dan x = −fX/Z e y = −fY/Z, así que P lleva −f en lugar de f. El modelo pone el plano delante de C, donde recoge los mismos rayos sin la inversión, y por eso P suele llevar +f.
Las imágenes de rayos X se ajustan al modelo con +f tal como está. La fuente de rayos X hace de centro óptico, y el objeto queda entre la fuente y el detector, que es el plano de imagen.
Y = f =
Arrastra M hacia los lados y en profundidad, desliza kM por el rayo, y arrastra el fondo para girar la vista. Y apunta hacia abajo, así que un Y negativo pone M sobre el eje óptico. Con el teclado, selecciona la figura, un punto o un campo con Tab y usa las flechas.
5Un punto dado en otro sistema de coordenadas
La proyección necesita M en las coordenadas de la cámara, con C en el origen y Z a lo largo del eje óptico. Los puntos rara vez se conocen así: se miden sobre un objeto, o en una sala, en un sistema de coordenadas propio. Toma el sistema de la cámara como el original, con ejes X, Y y Z, y el del objeto como el nuevo, con ejes X′, Y′ y Z′. Entonces las columnas de R′ son los ejes del objeto vistos desde la cámara, y t′ es donde la cámara ve el origen del objeto. Un punto con coordenadas M′ en el objeto está en M = S′M′ en el sistema de la cámara, como en la sección 3, y
Léelo de derecha a izquierda: primero lleva el punto a las coordenadas de la cámara, luego proyéctalo. El producto PS′ es una sola matriz de 3 × 4, y su tercera fila da λ, la profundidad del punto delante de la cámara.
6De milímetros a píxeles
Las coordenadas (x, y) de m son largos sobre el plano de imagen, digamos en milímetros, medidos desde el punto principal. Una imagen, en cambio, se lee en píxeles: u cuenta columnas hacia la derecha y v cuenta filas hacia abajo, desde la esquina superior izquierda. Escribe w = [u v 1]T para el mismo punto en píxeles.
Para que ambos sistemas queden alineados, los ejes de la cámara se eligen a lo largo del sensor: X y x apuntan a la derecha, a lo largo de las filas, e Y e y apuntan hacia abajo, a lo largo de las columnas. Con Z apuntando hacia adelante, hacia la escena, los tres ejes forman un sistema de mano derecha. Así no se necesita ningún giro entre (x, y) y (u, v): cualquier giro de la cámara ya está en S′. Lo que falta toma tres pasos.
Traslación. El punto principal cae en algún píxel (u0, v0), normalmente cerca del centro de la imagen, no en la esquina donde empiezan u y v. Pero sumar u0 y v0 no basta por sí solo, ya que x e y están en milímetros y u y v en píxeles.
Escala. El sensor tiene αx píxeles por milímetro a lo largo de x y αy a lo largo de y, así que u = αxx + u0 y v = αyy + v0. Las dos escalas difieren cuando los píxeles no son cuadrados.
Torcimiento. Si las filas y las columnas del sensor no son exactamente perpendiculares, un paso a lo largo de y también avanza columnas, lo que agrega un término sy a u. A s se le llama factor de torcimiento, y en la mayoría de las cámaras vale 0 o muy cerca de 0.
En conjunto:
K se llama la matriz de calibración de la cámara. Con su última fila [0 0 1], es una transformación afín del plano de imagen, del tipo visto en los apuntes de transformaciones 2D, así que conserva las rectas paralelas. Sus cinco números dependen solo de la cámara: el tamaño y la disposición de sus píxeles, y dónde su eje óptico corta el sensor.
7El modelo de cámara
Juntando los pasos: lleva el punto a las coordenadas de la cámara, proyéctalo y conviértelo a píxeles.
Al multiplicar K por P se obtiene
La distancia focal nunca aparece sola, sino multiplicada por αx, αy y s. Un lente el doble de largo con píxeles el doble de grandes da exactamente la misma imagen, así que las imágenes solo permiten conocer los productos, y estos reciben nombres propios: α = fαx, β = fαy y γ = fs.
Así, una cámara queda descrita por once números. Cinco son parámetros intrínsecos, α, β, γ, u0 y v0, que pertenecen a la cámara misma. Seis son parámetros extrínsecos, los ángulos ωX, ωY, ωZ y las tres componentes de t′, que dicen dónde está la cámara y hacia dónde apunta, respecto del objeto. La cuenta coincide con la matriz: el producto completo KPS′ es una matriz de 3 × 4 con doce entradas, y, como en toda ecuación homogénea, multiplicarla por un número no cambia nada, lo que deja once.
Este producto se llama matriz de proyección general. A menudo también se escribe P, y A, B, C, … cuando varias cámaras miran la misma escena. La P simple de la sección 4 es el caso K = I y S′ = I. Encontrar los once números a partir de imágenes de puntos conocidos se llama calibración de la cámara.
8Resumen
Las ideas clave junto a sus equivalentes en NumPy.
Rz = np.array([ [np.cos(wz), np.sin(wz), 0], [-np.sin(wz), np.cos(wz), 0], [0, 0, 1]])R = Rx @ Ry @ RzS = np.block([[R, t.reshape(3, 1)], [0, 0, 0, 1]])Mp = S @ MSp = np.linalg.inv(S)M = Sp @ MpP = np.array([[f, 0, 0, 0], [0, f, 0, 0], [0, 0, 1, 0]])m = P @ Mm = m / m[2]w = K @ mw = K @ P @ Sp @ Mpw = w / w[2]