He estado trabajando en el tema de la estimación de pose de cámara para aplicaciones de realidad aumentada y seguimiento visual durante un tiempo y creo que aunque hay mucha información detallada sobre la tarea, todavía hay muchas confusiones y malentendidos.
Creo que las siguientes preguntas merecen una respuesta detallada paso a paso.
- ¿Qué son las cámaras intrínsecas?
- ¿Qué son las cámaras extrínsecas?
- ¿Cómo calculo la homografía a partir de un marcador plano?
- Si tengo homografía, ¿cómo puedo obtener la pose de la cámara?
Respuestas:
Es importante entender que el único problema aquí es obtener los parámetros extrínsecos. La intrínseca de la cámara se puede medir fuera de línea y hay muchas aplicaciones para ese propósito.
¿Qué son las cámaras intrínsecas?
Parámetros intrínsecos de la cámara por lo general se llama la matriz de calibración de la cámara,K . Podemos escribir
dónde
y α v son el factor de escala en lasdirecciones de coordenadas u y v , y son proporcionales a la distancia focal f de la cámara: α u = k u f y α v = k v f . k u y k v son el número de píxeles por unidad de distancia en lasdirecciones u y v .αtu αv tu v F αtu= ktuF αv= kvF ktu kv tu v
se llama el punto principal, generalmente las coordenadas del centro de la imagen.c = [ u0 0, v0 0]T
es la inclinación, solo que no es cero si u y v no son perpendiculares.s tu v
Una cámara se calibra cuando se conocen intrínsecos. Esto se puede hacer fácilmente para que no se considere un objetivo en la visión por computadora, sino un paso trivial fuera de línea.
Algunos enlaces:
ftp://svr-ftp.eng.cam.ac.uk/pub/reports/mendonca_self-calibration.pdf
¿Qué son las cámaras extrínsecas?
Cámara extrínseca o parámetros externos es una matriz de 3 × 4 que corresponde a la transformación euclidiana de un sistema de coordenadas mundiales al sistema de coordenadas de la cámara. R representa una matriz de rotación 3 × 3 y t una traslación.[ R | t ] 3 × 4 R 3 × 3 t
Las aplicaciones de visión por computadora se centran en estimar esta matriz.
¿Cómo calculo la homografía a partir de un marcador plano?
La homografía es una matriz homogénea que relaciona un plano 3D y su proyección de imagen. Si tenemos un plano Z = 0, la homografía H que mapea un punto M = ( X , Y , 0 ) T en este plano y su correspondiente punto 2D m debajo de la proyección P = K [ R | t ] es3 × 3 Z= 0 H METRO= ( X, Y, 0 )T metro PAGS= K[ R | t ]
Para calcular la homografía necesitamos pares de puntos mundo-cámara. Si tenemos un marcador plano, podemos procesar una imagen del mismo para extraer características y luego detectar esas características en la escena para obtener coincidencias.
Solo necesitamos 4 pares para calcular la homografía usando Transformación lineal directa.
Si tengo homografía, ¿cómo puedo obtener la pose de la cámara?
La homografía y la cámara plantean K [ R | t ] contienen la misma información y es fácil pasar de una a otra. La última columna de ambos es el vector de traducción. La columna uno H 1 y dos H 2 de homografía también son la columna uno R 1 y dos R 2 de la matriz de pose de cámara. Solo queda la columna tres R 3 de [ R | t ] , y como tiene que ser ortogonal, se puede calcular como el producto cruzado de las columnas uno y dos:H K[ R | t ] H1 H2 R1 R2 R3 [ R | t ]
fuente
Si bien explica muy bien el caso bidimensional, la respuesta propuesta por Jav_Rock no proporciona una solución válida para las posturas de la cámara en el espacio tridimensional. Tenga en cuenta que para este problema existen múltiples soluciones posibles.
Este artículo proporciona fórmulas cerradas para descomponer la homografía, pero las fórmulas son algo complejas.
OpenCV 3 ya implementa exactamente esta descomposición ( decomposeHomographyMat ). Dada una homografía y una matriz intrínseca correctamente escalada, la función proporciona un conjunto de cuatro rotaciones y traslaciones posibles.
La matriz intrínseca en este caso debe darse en unidades de píxeles, lo que significa que su punto principal suele ser
(imageWidth / 2, imageHeight / 2)
y su distancia focal suele serfocalLengthInMM / sensorWidthInMM * imageHeight
.fuente
focalLengthInMM / sensorWidthInMM * imageWidth
? ¿Por qué eliges la altura?