Visión por computadora: tengo 3 imágenes, con una relación proyectiva conocida entre la imagen 1 y 2 y entre la imagen 2 y 3. ¿Cómo puedo encontrar la relación proyectiva entre la imagen 1 y 3 cuando no hay una correspondencia puntual entre la imagen 1 y 3?

Entonces los siguientes serán los símbolos utilizados:

R12, R23 -> Matrices de rotación
T12, T23 -> Vectores de traducción
C1, C2, C3 -> Sistemas de coordenadas del mundo real para cada cámara. Solo como referencia, no tienen ningún valor.

Primera nota:
Para encontrar las matrices esenciales, debe normalizar las coordenadas de la imagen con las matrices de calibración de la cámara de las 3 cámaras . Si no lo hace, entonces está trabajando en la matriz Fundamental .

Segunda nota:
Supongo que los pares de puntos x1 – x2 y x2 – x3 son diferentes. Como en, x2 son puntos diferentes entre los pares de imágenes.

Solución según yo:

Usando la matriz Essential

La matriz esencial tiene solo 5 DOF, tanto la rotación como la traslación tienen 3 grados de libertad, pero existe una ambigüedad general de escala. Podemos suponer que la primera matriz de cámara para C1 es P1 = [I | 0]. Para calcular la segunda matriz de la cámara, debemos factorizar E12 en el producto SR, es decir, S -> Una matriz simétrica sesgada y R -> Una matriz de rotación.

Le recomiendo que lea la página 258 de la página en ox.ac.uk (Geometría de vista múltiple – Hartley y Zisserman)

Nota: La solución dada por ellos es ambigua hasta un factor de escala.

Luego puede continuar en la sección ‘Encontrar la homografía’. Mi recomendación es que sigas el camino de la matriz Fundamental.

Usando la matriz fundamental

La matriz fundamental tiene 7 grados de libertad y el factor de escala está en su lugar.

Suponga que P1 = [I | 0]

Entonces se puede dar la segunda matriz de proyección:

P2 = [cruz (e2) * F | e2]

donde e2 es el Epipole en la Cámara 2 al obtener imágenes del centro de la Cámara 1. (Si está intentando esto, recuerde que los Epipoles DEBEN normalizarse dividiendo el vector con el tercer elemento, es decir, trabajando en el espacio euclidiano)

Los epípoles se pueden encontrar usando el espacio nulo de la matriz Fundamental y se transpone. Leer MATLAB Espacio nulo – MATLAB nulo

Encontrar la homografía

Una vez que tenemos P1 y P2, tenemos R12 y T12.
Del mismo modo, una vez que tenemos P2 y P3, tenemos R23 y T23.

Para ir de C1 a C2, tienes R12 y T12.
Para ir de C2 a C3, tienes R23 y T23.

Por lo tanto, podemos representarlos en una transformación de homografía ¿verdad?

Dejar,

Del mismo modo, puedes construir H23.

Entonces, para pasar de C1 a C3, suponiendo que C1 está en [0,0,0] o P1 = [I | 0].

H13 = H12 X H23.

¿Correcto?

– Normalice la nueva matriz H13 de modo que H13 (4,4) = 1.

– Descomponga la matriz H13 recién formada en R13 y T13.

– Divida R13 por su determinante y, a la inversa, T13 múltiple por ese determinante.

Ahí tienes!

Error de reproyección esperado

Como x1 – x2 y x2 – x3 son pares diferentes, es decir, x2 es diferente para ambos pares. Es probable que haya un error de reproyección comparativamente ‘más grande’.

El espacio x2 se transforma con respecto a C1 en [0,0,0], ¿correcto?

es decir, x2 = P2 * X

Pero verdaderamente escrito,

x2 = P2 * X + m

similar

x3 = P3 * X ‘+ n (X’ es una visión del mundo real al configurar C2 en [0,0,0])

Pero, no queremos usar X ‘, queremos usar X para encontrar una relación entre C3 y C1. Entonces, aplicamos la transformación de homografía a X ‘diciendo X’ = H12 * X. Esto técnicamente significa:

x3 = P3 * (H12 * X + m ‘) + n = P3 * H12 * X + P3 * m’ + n

¡Puedes ver cómo aumentará el error! Pero no debería aumentar drásticamente suponiendo que sus puntos estén perfectamente calibrados. Además, cuanto más se acerque x2 al par de imágenes 1 – 2 y al par de imágenes 2 – 3, menor será su error. También puede aplicar algún tipo de ajuste de paquete para reducir aún más el error de reproyección.

Otro método como lo preguntaste

Puedes leer sobre ” El tensor trifocal “. De nuevo, del mismo libro:

Página en ox.ac.uk


Se ve genial, ¿no? 😀

Esto parece muy extraño. Seguramente si son imágenes solo con rotación y traducción, entonces todo lo que necesita son tres números para la traducción y uno para la rotación, y puede agregar ambos.

Si realmente tiene vectores de traducción y matrices de rotación, hay dos formas de hacerlo. Ambos implican primero hacerlos en 3D agregando ceros.

La forma más canónica es usar coordenadas homogéneas. Para hacer esto, toma la matriz de rotación y el vector de traducción representado como un vector de fila. Apila la matriz de rotación (que también puede sesgar, dimensionar e inclinar) en la parte superior del vector de traducción de fila. Luego pones la matriz de columna [0, 0, 0, 1] en el lado derecho. Luego puedes multiplicar las dos matrices para obtener el resultado.

(No me pregunte si necesita tomar la transposición de la matriz de rotación y cuál multiplica con qué. Después de más de 30 años de hacer esto, nunca puedo recordarlo. Afortunadamente, es uno u otro, y entonces hay solo algunas cosas para probar)

Sin embargo, una mejor manera sería convertir la matriz de rotación en un cuaternión. Existen algoritmos para hacer esto. Si la matriz está fuera de una verdadera matriz de rotación, simplemente normalice el cuaternión para que tenga un valor absoluto de 1. Luego puede agregar las traducciones y conjugar y multiplicar los cuaterniones. Ver Cuaterniones y rotación espacial para fórmulas.

Esto es genial porque, a veces, es posible que desee animar. Los cuaterniones son fáciles de animar y están libres de ejes preferidos y bloqueo de cardán, a diferencia de las matrices. Todo lo que realmente tienes que hacer es animar sobre la superficie de una esfera de 4. Encuentro curvas simples de Bezier útiles para hacer esto.