Modelo de Cámaras

En esta sección daremos el modelo de una cámara y la manera de calcular el módelo de la misma. El modelo esta diseñando principalmente para sensores como CCD pero también es aplicable a otras cámaras.

El modelo de cámara pinhole

Consideremos el punto central de proyección del espacio en un plano. Centraremos la proyección del espacio Euclidiano de coordenadas y consideraremos que el plano es Z=f, el cual es llamado el plano focal de la cámra. Bajo el modelo de camara pinhole, un punto de coordenadas en el espacio X=(([X,Y,Z])^T) es mapeado en el punto del plano de la imagen donde las lineas se unen en el centro de proyeción. Esto puede mostrarse por triangulos similares en la siguiente figura.

En la figura, por triangulos similares podemos ver que el punto (([X, Y, Z])^T) es mapeado a un punto en  el plano de la cámara como (([f X/Z, f Y/Z, f])^T). Esto lo podems escribir de forma matricial como

(({{f X}, {f Y}, {Z}}))=(({{f, □, □, 0}, {□, f, □, 0}, {□, □, 1, 0}}))(({{X}, {Y}, {Z}, {1}}))

esta matriz  puede ser escrita como diag(f,f,1)[I|0] así la matriz de proyección para una cámara con modelo pinhole es P=diag(f,f,1)[I|0]. La expresión anterior asume que el origen de coordenadas en el plano de la imagen es el punto principal. En la práctica no es así por lo cual debemos aplicar un mapeo

(((X,Y,Z))^T)↦(((f X/Z+ (Subscript[p, x]), f X/Z + (Subscript[p, y])))^T) 

esta ecuación puede expresarse como

(({{f X+ Z (Subscript[p, x])}, {f Y+ Z (Subscript[p, y])}, {Z}}))=(({{f, □, (Subscript[p, x]), 0}, {□, f, (Subscript[p, y]), 0}, {□, □, 1, 0}}))(({{X}, {Y}, {Z}, {1}}))
donde 

K=(({{f, □, (Subscript[p, x])}, {□, f, (Subscript[p, y])}, {□, □, 1}}))

y x=K[I|0](Subscript[X, cam])  donde la matriz K es llamada la matriz de calibración de la cámara.

En general puntos en el espacio son expresados en términos de coordenadas euclidianas diferentes, conocidas como marco de coordenadas del mundo. Estos dos marco son relacionados por una rotación y una translación. Si (OverTilde[X ])son las coordenadas homogeneas del mundo estas pueden ser representadas en el marco de la camara como como (Subscript[(OverTilde[X]), cam])=R((OverTilde[X])-(OverTilde[C])), donde (OverTilde[C]) representa las coordenadas de la cámara centradas en las coordenadas del mundo. El modelo puede ser escrito en coordenadas homogenas como

(Subscript[x, cam])=(({{R, -R (OverTilde[C])}, {0, 1}}))(({{X}, {Y}, {Z}, {1}})) 

Poniendo todo junto tenemos  x=K R[I|-(OverTilde[C])]X donde la matriz de la cámara es P=K[R|t] donde t=-R (OverTilde[C])

Camaras CCD

El modelo de cámara pinhole asume que las coordenadas de la imagen tienen igual escala en ambos ejes. En el caso de la cámaras CCD existe una posibilidad adicional de no tener pixeles cuadrados. Por lo tanto manejaremos en lugar de usar un factor de escala f en la diagonal consideraremos que existe un número de pixeles en la direción x llamado (Subscript[m, x]) y uno en la direción y llamado (Subscript[m, y]) por lo tanto nuestra matriz de parametros queda como 

K=(({{f (Subscript[m, x]), □, (Subscript[x, 0])}, {□, f (Subscript[m, y]), (Subscript[y, 0])}, {□, □, 1}}))=(({{(Subscript[α, x]), □, (Subscript[x, 0])}, {□, (Subscript[α, y]), (Subscript[y, 0])}, {□, □, 1}}))

Podemos consideran un modelo mas general si agregamos un parametro al que denominaremos s al que denominaremos sesgo. En la mayoría de la cámaras normales este valor es cero, sin embargo lo consideraremos en el sentido de tener un modelo más general.

K=(({{(Subscript[α, x]), s, (Subscript[x, 0])}, {□, (Subscript[α, y]), (Subscript[y, 0])}, {□, □, 1}}))

El modelo de la cámara proyectiva es una matriz no cuadrada con tres renglones y cuatro columnas, por lo tanto el modelo tendrá 11 grados de libertad. Este modelo lo podemos escribir como P=M[I|(M^(-1))(Subscript[p, 4])]=K R[I|-(OverTilde[C])] donde (Subscript[p, 4])  es la última columna de la matriz P. El modelo completo es conocido como el módelo de la cámara proyetiva.

Propiedades de la cámara Proyectiva

Algunas propiedades de la cámara proyectiva son

1. Centro de la camara. El centro de la cámara es el vector C el cual puede ser calculado para una cámara finita como el vector en el espacio nulo es decir PC=0. Esto se resuelve utilizando descomposición en Valores singulares y 

2. Puntos columna. Para i =1,2,3 los vectores columna (Subscript[p, i])son los puntos de fuga en la imagen correpondientes a los ejes X, Y y Z. Columna (Subscript[p, 4]) es la imagen de las coordenadas del origen.

3. Plano principal. El plano principal de la cámara is (p^3), el último renglón de P.

4. Ejes del plano. Los planos (p^1)y (p^2) representan los planos a través del centro de la cámara.

5. Punto principal. Punto de imagen (Subscript[x, 0])=M (m^3)es el punto principal de la cámar, donde (m^(3T)) es el tercer renglón de la matriz M.

6. Rayo principal. El rayo principal de la camara es el rayo que pasa a través de la cámara con centro C con dirección  (m^(3T)). El eje principal es el vector v=det(M)(m^3) es la dirección hacia el frente de la cámara.

Calibración de Cámaras

La calibración de cámaras la definiremos como el proceso de calcular los parámetros internos a partir de la observación de una imagen. Comenzaremos por dada la matriz de proyección, calcular la matriz de parametros internos K, el centro de la cámara C y la matriz de rotación de la cámara P=K R[I|C]. Podemos ver de lo expuesto en la sección anterior que el centro de la cámara dado la matriz de proyección se puede calcular como P C = 0 cuya solución es el vector con el menor eigenvalor una vez calculado la descomposición en valores singulares (espacio nulo). 

Definamos la matriz M=K R la cual es una matrix de 3 renglones por 3 columnas. Para ello tendremos que hacer una factorización matricial.  Recordemos que  la matriz R puede calcularse como la multiplicación de tres matrices de rotación en cada eje como R = (Subscript[R, z]^T)(Subscript[R, y]^T) (Subscript[R, x]^T)  dado que todas estas matrices son ortogonales, entonces podemos escibir

M=K R = K (Subscript[R, z]^T)(Subscript[R, y]^T) (Subscript[R, x]^T) 
 M (Subscript[R, x])(Subscript[R, y])(Subscript[R, z])= K 

Las matrices de rotación estan definidas como

(Subscript[R, x])=(({{1, 0, 0}, {0, (Subscript[c, x]), -(Subscript[s, x])}, {0, (Subscript[s, x]), (Subscript[c, x])}})), (Subscript[R, y])=(({{(Subscript[c, y]), 0, (Subscript[s, y])}, {0, 1, 0}, {-(Subscript[s, y]), 0, (Subscript[c, y])}}))  y  (Subscript[R, x])=(({{(Subscript[c, y]), -(Subscript[s, z]), 0}, {(Subscript[s, z]), 1, 0}, {0, 0, (Subscript[c, y])}}))   

donde (Subscript[c, i])= cos((Subscript[θ, i])) y (Subscript[s, i])= seno((Subscript[θ, i])) 

Dada la matriz M Los pasos son

1. Multiplicar M' = M (Subscript[R, x]) y calcular (Subscript[c, x]) y (Subscript[s, x ])para que el elemento (Subscript[M', 3,2]) =0 y (Subscript[c, x]^2)+(Subscript[s, x]^2) = 1. La solución es

(Subscript[c, x])=((Subscript[M, 3,3])/(Sqrt[(Subscript[M, 3,2]^2)+(Subscript[M, 3,3]^2)]))y (Subscript[s, x])=-((Subscript[M, 3,2])/(Sqrt[(Subscript[M, 3,2]^2)+(Subscript[M, 3,3]^2)])) 
2. Multiplicar M'' = M' (Subscript[R, y]) y calcular (Subscript[c, y]) y (Subscript[s, y ])para que el elemento (Subscript[M'', 3,1]) =0 y (Subscript[c, y]^2)+(Subscript[s, y]^2) = 1. La solución es

(Subscript[c, y])=((Subscript[M, 3,3])/(Sqrt[(Subscript[M, 3,1]^2)+(Subscript[M, 3,3]^2)]))y (Subscript[s, y])=-((Subscript[M, 3,1])/(Sqrt[(Subscript[M, 3,1]^2)+(Subscript[M, 3,3]^2)])) 
3. Finalmente multiplicar K = M' '(Subscript[R, z]) y calcular (Subscript[c, z]) y (Subscript[s, z ])para que el elemento (Subscript[M'', 2,1]) =0 y (Subscript[c, z]^2)+(Subscript[s, z]^2) = 1. La solución es

(Subscript[c, z])=-((Subscript[M, 2,2])/(Sqrt[(Subscript[M, 2,1]^2)+(Subscript[M, 2,2]^2)]))y (Subscript[s, z])=((Subscript[M, 2,1])/(Sqrt[(Subscript[M, 2,1]^2)+(Subscript[M, 2,2]^2)])) 

ver calibra_camaras.java

Ejemplo

Dada la matriz de proyección de la cámara determinar el centro de la misma.

P = {{3.53553*10^2, 3.39645*10^2, 2.77744*10^2, -1.44946*10^6},{-1.03528*10^2, 2.33212*10^1, 4.59607*10^2, -6.32525*10^5},
{7.07107*10^-1, -3.53553*10^-1, 6.12372*10^-1, -9.18559*10^2}};

MatrixForm[P]
M = {P[[All, 1]], P[[All, 2]], P[[All,3]]}
MatrixForm[M]
{u , s,  v} = SingularValueDecomposition[P];
MatrixForm[u]
MatrixForm[s]
MatrixForm[v]
Co = v[[All,4]]/v[[4,4]]

MatrixForm[P.Co]

Así dado un conjunto de puntos en 3D Q={(Subscript[Q, 1]), (Subscript[Q, 2]), ..., (Subscript[Q, N])} con (Subscript[Q, i])=((((Subscript[X, i]), (Subscript[Y, i]), (Subscript[Z, i])))^T)  y otro conjunto de puntos correspondientes en el plano de la imagen q={(Subscript[q, 1]), (Subscript[q, 2]), ..., (Subscript[q, N])} con (Subscript[q, i])=((((Subscript[x, i]), (Subscript[y, i]), (Subscript[w, i])))^T) podemos determinar el modelo de la cámara con al menos 6 puntos correspondientes (Subscript[X, i])⟷(Subscript[x, i]) resolviendo

(({{(Subscript[x, i])}, {(Subscript[y, i])}, {(Subscript[w, i])}}))=(({{(Subscript[P, 1,1]), (Subscript[P, 1,2]), (Subscript[P, 1,3])}, {(Subscript[P, 2,1]), (Subscript[P, 2,2]), (Subscript[P, 2,3])}, {(Subscript[P, 3,1]), (Subscript[P, 3,2]), (Subscript[P, 3,3])}}))(({{(Subscript[X, i])}, {(Subscript[Y, i])}, {(Subscript[Z, i])}}))=(({{(Subscript[Q, i]^T)(Subscript[P, 1])}, {(Subscript[Q, i]^T)(Subscript[P, 2])}, {(Subscript[Q, i]^T)(Subscript[P, 3])}}))

Para resolver calculamos un vector paralelo, el cual tiene un producto vectorial igual a cero (Subscript[q, i])×P (Subscript[Q, i])=0. El sistema resultante lo podemos calcular encontrando el vector en el espacio nulo con descomposición en valores singulares. El sistema resultante a resolver es

(Subscript[q, i])×P (Subscript[Q, i])=(({{(OverHat[i]), (OverHat[j]), (OverHat[k])}, {(Subscript[x, i]), (Subscript[y, i]), (Subscript[w, i])}, {(Subscript[Q, i]^T)(Subscript[P, 1]), (Subscript[Q, i]^T)(Subscript[P, 2]), (Subscript[Q, i]^T)(Subscript[P, 3])}}))=(({{(Subscript[y, i])(Subscript[Q, i]^T)(Subscript[P, 3])-(Subscript[w, i])(Subscript[Q, i]^T)(Subscript[P, 2])}, {(Subscript[x, i])(Subscript[Q, i]^T)(Subscript[P, 3])-(Subscript[w, i])(Subscript[Q, i]^T)(Subscript[P, 1])}, {(Subscript[x, i])(Subscript[Q, i]^T)(Subscript[P, 3])-(Subscript[w, i])(Subscript[Q, i]^T)(Subscript[P, 1])}}))=0

de lo cual podemos desprender

(({{0, -(Subscript[w, i])(Subscript[Q, i]^T), (Subscript[y, i])(Subscript[Q, i]^T)}, {-(Subscript[w, i])(Subscript[Q, i]^T), 0, (Subscript[x, i])(Subscript[Q, i]^T)}}))(({{(Subscript[P, 1])}, {(Subscript[P, 2])}, {(Subscript[P, 3])}}))=0

Ejemplo

Dados los los puntos correpondientes Q = { [0.0,  0.0,  0.0], [ 100.0, 0.0, 0.0],  [100.0,  100.0, 0.0],  [0.0,  100.0 , 0.0], [0.0, 0.0, 100.0], [100.0, 0.0 100.0], [100.0,  100.0,  100.0],  [0.0,  100.0,  100.0 ]} y q = {[1577.9715837523775,  688.6057400776651], [1667.8746657863205, 758.2462570249891], [1562.6523714350803, 725.2525691697816], [1483.8812040033367, 660.6388854847863],  [1658.2870049496003, 684.1821822330893], [1762.4087684498734, 758.8465253032915], [1645.2811209801278, 723.3689600937458], [1554.5611061379307, 654.4720145727945]}, calcular

a) La matriz de proyección de la cámara,
b) La posición del centro de la cámara,
c) La matriz de Rotación y
d) la matriz K de parámetros internos.

P = {{0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.9999,0.0,0.0,0.0,688.6057},
{0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-1577.9715},
{0.0,0.0,0.0,0.0,-99.9999,0.0,0.0,-0.9999,75824.6257,0.0,0.0,758.2463},
{100.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,-166787.4665,0.0,0.0,-1667.8746},
{0.0,0.0,0.0,0.0,-99.9999,-99.9999,0.0,-0.9999,72525.2569,72525.2569,0.0,725.2526},
{100.0,100.0,0.0,1.0,0.0,0.0,0.0,0.0,-156265.237,-156265.237,0.0,-1562.6523},
{0.0,0.0,0.0,0.0,0.0,-99.9999,0.0,-0.9999,0.0,66063.8885,0.0,660.6389},
{0.0,100.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,-148388.1203,0.0,-1483.8811},
{0.0,0.0,0.0,0.0,0.0,0.0,-99.9999,-0.9999,0.0,0.0,68418.2182,684.1822},
{0.0,0.0,100.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,-165828.7004,-1658.2869},
{0.0,0.0,0.0,0.0,-99.9999,0.0,-99.9999,-0.9999,75884.6525,0.0,75884.6525,758.8465},
{100.0,0.0,100.0,1.0,0.0,0.0,0.0,0.0,-176240.8767,0.0,-176240.8767,-1762.4087}
{0.0,0.0,0.0,0.0,-99.9999,-99.9999,-99.9999,-0.9999,72336.896,72336.896,72336.896,723.369},
{100.0,100.0,100.0,1.0,0.0,0.0,0.0,0.0,-164528.112,-164528.112,-164528.112,-1645.281},
{0.0,0.0,0.0,0.0,0.0,-99.9999,-99.9999,-0.9999,0.0,65447.2015,65447.2015,654.472}
{0.0,100.0,100.0,1.0,0.0,0.0,0.0,0.0,0.0,-155456.1105,-155456.1105,-1554.561}};
MatrixForm[P]

Comenzamos por hacer la SVD

{u, s, v} = SingularValueDecomposition[P];
MatrixForm[V]
aux = V[[All,12]];
p1 = MatrixForm[aux, {3,4}]

b) El centro de la cámara es

Co= {1000.0007,2000.002,1500.0003,1.0};
MatrixForm[Co]