scieee AI-readable full text Open interactive document viewer

Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos

Pérez Rus, Marcos

Abstract

El objetivo principal de este trabajo es el de establecer unas pautas claras a seguir para la calibración de un sistema multicámara. Trabajaremos con un sistema compuesto por cuatro cámaras que toman imágenes de forma sincronizada. Utilizando únicamente las imágenes de un patrón impreso tomadas por las cámaras, nuestro objetivo será el de averiguar una serie de parámetros, entre ellos la posición y rotación relativa entre las cámaras y algunos datos internos de las mismas. Este sistema será utilizado en un futuro para la localización tridimensional en interiores de diversos objetos equipados con marcadores (identificadores visuales) con un alto grado de precisión y velocidad. Para simplificar el proceso de prueba y error, se desarrollará una simulación del sistema y trabajaremos con imágenes generadas de forma sintética pero realistas.

Full text

Equation Chapter 1 Section 1 Dpto. de Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Trabajo Fin de Grado Ingeniería Electrónica, Robótica y Mecatrónica Autor: Marcos Pérez Rus Tutor: Manuel Vargas Villanueva Sevilla, 20 20 iii Trabajo Fin de Grado Ingeniería Electrónica, Robótica y Mecatrónica Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Autor: Marcos Pérez Rus Tutor: Manuel Vargas Villanueva Profesor titular Dpto. de Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020 v Trabajo Fin de Grado: Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Autor: Marcos Pérez Rus Tutor: Manuel Vargas Villanueva El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2020 El Secretario del Tribunal vii A mi familia A mis amigos A mi novia A mis profesores ix Agradecimientos Escribiendo estas líneas le digo adiós a una de las mejores etapas de mi vida. Desde que entré en la Universidad allá por 2015 siento que no he dejado de crecer tanto en el ámbito personal como en el académico. Por eso quiero dedicar este trabajo a todas las personas que lo han hecho posible, y agradecerles haber estado ahí. Muchas gracias a mis padres, de los que he aprendido casi todo lo que sé hoy. Por enseñarme a luchar por lo que quiero, a ser valiente e ir siempre hacia delante. Pero sobre todo por enseñarme a querer sin miedo, a dejarme querer y a mirar siempre a los ojos cuando hablo. Gracias también a mi hermana por su complicidad. Te echaré de menos, Berlín no está preparada para ti. Muchas gracias a mis amigos, con los que he compartido sobre todo risas, buenos momento y un poquito de estrés. Habéis hecho que estos años merezcan la pena. Gracias también por darme todo el apoyo y la ayuda que necesitase para sacar adelante la carrera. Muchas gracias a mi novia por ayudarme a ver siempre la luz al final del túnel. Sé que, si tropiezo o necesito un descanso, puedo contar contigo para darme fuerzas y seguir con el camino, sin motivos ni condiciones. Eres uno de los mejores regalos que me llevo de esta etapa. Y por último muchas gracias a todos los profesores que han aportado a mi formación y me han ayudado a descubrir y entender el mundo. En especial a mi tutor, Manuel Vargas, por todas las molestias que se ha tomado en guiarme durante todo el proceso de elaboración de este trabajo y su implicación en la asignatura de “Sistemas de Percepción” con todos los alumnos para que aprendiésemos de verdad. Marcos Pérez Rus Sevilla, 2020 ÍNDICE DE TABLAS Tabla 5-1. Comparación de los resultados de la calibración. 62 xvii ÍNDICE DE FIGURAS Figura 1-1. Captura de movimiento para generar animaciones 3 Figura 1-2. Ejemplo de proceso frotogramétrico 4 Figura 1-3. Funcionamiento de la trilateración 4 Figura 1-4. Balizas de la marca Marvelmind robotics (1) 5 Figura 2-1. Cámara oscura 8 Figura 2-2. Efectos de la geometría proyectiva 9 Figura 2-3. Efecto de la distancia focal 9 Figura 2-4. Proceso de formación de una imagen 10 Figura 2-5. Tipos de distorsión más frecuentes 11 Figura 2-6. Modelo completo de la cámara 13 Figura 3-1. Fenómeno de retrorreflexión 16 Figura 3-2. Estructura del sistema real 17 Figura 3-3. Cámaras empleadas 18 Figura 3-4. Marcadores retrorreflectantes 18 Figura 3-5. Focos de luz infrarroja 19 Figura 3-6. Ordenador 20 Figura 4-1. Disposición de las cámaras 23 Figura 4-2. Colocación del patrón 24 Figura 4-3. Proyección de las esquinas del patrón en cada cámara 26 Figura 4-4. Patrón de calibración formado por ruido aleatorio 26 Figura 4-5. Proyección del patrón distorsionado 29 Figura 4-6. Detalle de borde negro 30 Figura 4-7. Imágenes sintéticas finales 31 Figura 4-8. Detalle del ruido en la imagen 31 Figura 5-1. Patrón de calibración para el algoritmo de Bouguet 33 Figura 5-2. Calibración primer toolbox, tercer paso 34 Figura 5-3. Calibración primer toolbox, cuarto paso 34 Figura 5-4. Calibración primer toolbox, cuarto paso (2) 35 Figura 5-5. Calibración primer toolbox, quinto paso 35 Figura 5-6. Calibración primer toolbox, quinto paso (2) 35 xix Figura 5-7. Calibración primer toolbox, quinto paso (3) 36 Figura 5-8. Calibración primer toolbox, quinto paso (4) 36 Figura 5-9. Calibración primer toolbox, quinto paso (4) 36 Figura 5-10. Calibración primer toolbox, sexto paso 37 Figura 5-11. Calibración primer toolbox, séptimo paso 37 Figura 5-12. Calibración primer toolbox, noveno paso 37 Figura 5-13. Representación gráfica de los parámetros extrínsecos de una pareja de cámaras 38 Figura 5-14. Patrón de calibración de ruido aleatorio 39 Figura 5-15. Superposición de ruido a distintas frecuencias 39 Figura 5-16. Generación del patrón aleatorio 40 Figura 5-17. Ejemplo de imágenes utilizadas 40 Figura 5-18. Calibración segundo toolbox, cuarto paso 41 Figura 5-19. Calibración segundo toolbox, quinto paso 41 Figura 5-20. Calibración segundo toolbox, sexto paso 41 Figura 5-21. Calibración segundo toolbox, séptimo paso 41 Figura 5-22. Error de reproyección medio y parámetros intrínsecos 42 Figura 5-23. Parámetros extrínsecos 43 Figura 5-24. Representación gráfica de los parámetros extrínsecos, tanto de los patrones como de las cámaras 43 Figura 5-25. Patrones vistos por cada cámara 44 Figura 5-26. Ejemplo de imagen oscurecida con puntero láser. 45 Figura 5-27. Fichero "expname.m" 46 Figura 5-28. Fichero "configdata.m" 47 Figura 5-29. Resultados de “im2points.m” 48 Figura 5-30. Error de reproyección medio por cámara. 49 Figura 5-31.- Puntos reales frente a reproyectados 49 Figura 5-32. Reconstrucción de las ubicaciones de las cámaras 50 Figura 5-33. Detalle de las posiciones de las cámaras 50 Figura 5-34. Script "im2points.m" sobre 150 imágenes a color 52 Figura 5-35. Detalle de las posiciones de las cámaras 53 Figura 5-36. Error de reproyección en función del tamaño físico del patrón. 56 Figura 5-37. Error de reproyección en función del tamaño físico del patrón (PPcm constantes) 57 Figura 5-38. Error de reproyección en función de la resolución del patrón 59 Figura 5-39. Error de reproyección en función del número de imágenes usadas en la calibración 61 xxi Notación 𝒑 Punto en coordenadas de la imagen (2D) 𝑷 Punto en coordenadas 3D 𝑷  Punto en coordenadas homogéneas (3D) 𝑷 𝑾 Punto en coordenadas globales (3D) 𝑷 𝑪 Punto en coordenadas de la cámara (3D) 𝑹 𝑾 𝑪 Matriz de rotación de coordenadas globales a coordenadas de la cámara 𝒕 𝑾 𝑪 Vector de traslación de coordenadas globales a coordenadas de la cámara 𝑻 𝑾 𝑪 Matriz de transformación de coordenadas globales a coordenadas de la cámara 1 1 INTRODUCCIÓN i queremos crear sistemas que sean capaces de interactuar de forma autónoma y segura con el espacio que les rodea, nos veremos obligados a dotarlos de “sentidos” que les permitan obtener información de su entorno. Particularmente, si lo que buscamos es un sistema que sea capaz de moverse a algunas coordenadas deseadas sin intervención humana, tendremos que hacer que dicho sistema tenga alguna manera de saber dónde se encuentra en cada instante. Este no es un problema trivial y actualmente disponemos de diversas maneras de abordarlo en función de las características del sistema y las especificaciones deseadas. En exteriores, el sistema GPS (Sistema de Posicionamiento Global) ha conseguido una precisión del orden de los centímetros, lo cual es suficiente en la mayoría de los casos. Sin embargo, la localización en interiores es aún objeto de estudio. Algunas tecnologías empleadas son los ultrasonidos, sistemas IPS (Sistema de Posicionamiento en Interiores) o la visión artificial, todas ellas pudiendo conseguir un alto grado de precisión. La solución que queremos estudiar se coloca dentro del campo de la visión artificial y consiste en un sistema multicámara. Las cámaras nos dan la ventaja de poder observar la mayoría de los eventos interesantes que puedan ocurrir, más aún si utilizamos cámaras de espectro no visible, además de una gran capacidad de comprender el entorno. También hay que tener en cuenta que el campo de visión de una cámara es relativamente grande comparado con otros sensores. Por último, el hecho de montar los sensores fuera del robot en lugar de a bordo de este, nos permite reducir su complejidad y tamaño, y también podremos localizar múltiples robots sin necesidad de aumentar la complejidad y el coste de la infraestructura. En comparación, un robot equipado con, por ejemplo, un sensor de ultrasonidos solamente podrá saber si existe un objeto físico a una determinada distancia y con un campo de visión muy inferior al de una cámara. Y no solo eso, además no tendrá ninguna manera de diferenciar si dicho objeto se trata de una persona o de un mueble. El problema es que, al tomar una imagen con una cámara, se pierde información de la profundidad de la escena. Por ello es necesario utilizar varias cámaras, dado que múltiples vistas de un espacio nos permitirán hacer una reconstrucción tridimensional del mismo, siempre y cuando conozcamos las posiciones y orientaciones relativas y las características internas de las cámaras. Averiguar estos parámetros se conoce como calibrar el sistema. La precisión de la que dispondremos más adelante a la hora de localizar un objeto dependerá directamente del grado de precisión de la calibración. Las aplicaciones de este tipo de sistemas incluyen sistemas de seguridad y vigilancia, localización de robots móviles, medicina y biomecánica, conducción autónoma, generación de modelos 3D y un largo etcétera. S Cualquier tecnología suficientemente avanzada es indistinguible de la magia. - Arthur C. Clarke - Introducción 2 La implementación de estos sistemas no es tarea fácil. Será muy importante asegurarnos de que la toma de imágenes se realice con la máxima sincronización posible para asegurarnos de que todas las cámaras captan la escena en el mismo instante. Si los objetos que queremos localizar se mueven muy rápido, deberemos tomar muchas imágenes por segundo y vamos a generar una gran cantidad de datos. El procesamiento de los datos puede hacerse localmente en cada cámara o centralizado en un único ordenador. Pero al ser el procesamiento de imágenes una tarea que requiere de una elevada capacidad de computación, lo más probable es que queramos realizarlo en un ordenador central. Esto implica que necesitaremos mucho ancho de banda para la transferencia de estos datos si queremos utilizarlos para aplicaciones en tiempo real. Por otro lado, la calibración suele ser un proceso engorroso, que requiere de cierto grado de intervención humana en la mayoría de los casos y probablemente haya que repetir varias veces al ser un proceso de prueba y error que difícilmente funcionará en el primer intento. Además, pequeños movimientos de las cámaras a lo largo del tiempo pueden hacer necesario calibrar periódicamente el sistema. En nuestro caso la calibración consistirá en tomar varias perspectivas con cada cámara de un patrón de calibración que imprimiremos previamente. También puede realizarse la calibración tomando varias perspectivas de un objeto cuya geometría sea conocida con precisión. Por último, debemos de asegurarnos de que haya suficientes cámaras para cubrir todo el espacio de trabajo y de que sus campos de visión estén parcialmente superpuestos. En entornos muy grandes o con muchos obstáculos, el número de cámaras necesarias puede llegar a ser elevado, lo que también conlleva un mayor coste y un proceso de calibración aún más difícil. Este problema cada vez es menos importante debido a la reducción de los costes y miniaturización tanto de este tipo de sensores como de la capacidad de computación. A continuación, se exponen algunos sistemas que ya se utilizan para la localización tridimensional de objetos en interiores. 1.1 Estado del arte 1.1.1 Sistemas multicámara comerciales Como hemos dicho, los sistemas multicámara tienen un amplio rango de aplicaciones. Es por ello que empresas como OptiTrack o Vicon ya venden todo el material necesario para poner en marcha sistemas de este tipo con la configuración que deseemos. Podemos especificar el volumen a cubrir, el uso que le vamos a dar a y el número de objetos a localizar de manera simultánea y nos recomendarán que tipo de cámaras, lentes y otros accesorios extra necesitaremos. Son ampliamente utilizados, por ejemplo, en cine y videojuegos para crear animaciones de movimiento realistas utilizando una serie de marcadores colocados sobre actores. 3 3 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 1-1. Captura de movimiento para generar animaciones Este proceso se conoce como “Motion Capture” o Captura de movimiento. Mediante esta técnica se transmite el movimiento de los actores a un modelo digital 3D y se pueden crear animaciones más realistas de una manera sencilla. Otro campo donde se utilizan sistemas multicámara es en biomecánica, una ciencia que estudia la aplicación de las leyes de la mecánica a la estructura y el movimiento de los seres vivos. El análisis preciso del movimiento del cuerpo humano nos permite desarrollar mejores prótesis y tratamientos fisioterapéuticos. También permite analizar los movimientos que realizamos al practicar deportes para mejorar el rendimiento y desarrollar técnicas de entrenamiento óptimas. Por último, la aplicación que más nos interesa, es en el campo de la robótica. Para hacer que un robot móvil terrestre o un dron sigan un camino establecido, necesitaremos conocer la posición y orientación de dicho robot en el espacio y, como se ha mencionado anteriormente, la localización de robots móviles en interiores no es un problema que pueda considerarse aún como resuelto. A la hora de detectar al robot en las imágenes, se pueden emplear dos metodologías: Se pueden colocar balizas sobre el robot o se puede detectar directamente mediante su geometría. El sistema más potente de OptiTrack permite la localización de hasta 48 drones de forma simultánea en un espacio de 15x15x6 metros (1350𝑚) utilizando 24 cámaras, y hace uso de balizas colocadas sobre los drones por un precio de 148.823 dólares. El más básico, con 4 cámaras para cubrir un volumen de 8𝑚 y localizar ~4 drones, cuesta 4.700 dólares. Si quisiéramos localizar robots móviles terrestres, los cuales se mueven más lentos, quizá sería posible aumentar estas cifras. La técnica en la que se basan todas estas aplicaciones se conoce como Fotogrametría. La fotogrametría nos permite obtener información sobre la forma, el tamaño y la posición en el espacio de un objeto utilizando únicamente fotografías de dicho objeto. Utilizando una foto, podemos obtener información sobre la geometría del objeto. Necesitaremos al menos dos fotos para conseguir visión estereoscópica e información tridimensional. Tradicionalmente se ha aplicado en ámbitos como la cartografía, arquitectura, levantamientos topográficos, etc. Actualmente un simple vuelo de dron nos permite crear una reconstrucción tridimensional precisa de un terreno de forma muy sencilla y automática. En algunos drones comerciales, el propio software del dron se encarga de definir la ruta, tomar las imágenes necesarias y volcarlas en el programa de fotogrametría. Se trata por tanto de una técnica ampliamente utilizada a día de hoy, cuyo origen se remonta a 1858. Modelo de la cámara 10 Figura 2-4. Proceso de formación de una imagen Como Podemos ver en la Figura 2-4, tenemos dos sistemas de coordenadas. Podemos definir un punto 3D en el sistema de coordenadas de la cámara 𝑷=[𝑋,𝑌,𝑍]. La proyección de dicho punto en la imagen será 𝒑=[𝑥,𝑦]. Posteriormente, cuando usemos múltiples cámaras, tendremos además un sistema de coordenadas global en el cual definiremos la posición de cada cámara. De ahora en adelante nos conviene utilizar coordenadas homogéneas: 𝒑=󰇩𝑥𝑦1󰇪~󰇩𝑥∙𝑤 𝑦∙𝑤 𝑤󰇪 𝑷=𝑋𝑌𝑍1~𝑋∙𝑊 𝑌∙𝑊 𝑍∙𝑊 𝑊 Siendo 𝑤 un factor de escala distinto de 0. Posteriormente podemos deshomogeneizar las coordenadas dividiendo las dos primeras (x e y) entre la tercera. Si alienamos el eje Z del sistema de coordenadas de la cámara con el eje óptico (como en la figura) y por semejanza de triángulos tendremos que: 𝑥=𝑓∙𝑋𝑍 𝑦=𝑓∙ 𝑌𝑍 Y podemos expresar esta relación en forma matricial: 11 11 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos 󰇩𝑥𝑦1󰇪=𝑓 0 0 0 0 𝑓 0 0 0 0 1 0𝑋𝑌𝑍1=𝑓𝑋 𝑓𝑌 𝑍~ ⎣ ⎢ ⎢ ⎢ ⎡ 𝑓𝑋𝑍 𝑓𝑌𝑍 1 ⎦ ⎥ ⎥ ⎥ ⎤ 𝒑=𝐾∙𝑷 Siendo K la matriz de proyección. Esta matriz nos permite obtener las coordenadas del punto proyectado sobre la imagen a partir de las coordenadas tridimensionales de dicho punto. En una cámara real habrá más factores a tener en cuenta a parte de la distancia focal: La distorsión de la lente y la discretización de los píxeles. 2.2 Distorsión de lente El modelo anterior realmente sólo es válido para la cámara estenopeica. Las cámaras reales utilizan lentes para focalizar la luz, pero al no ser lentes perfectas inducen una distorsión en la imagen. Es posible modelar este efecto utilizando una serie de coeficientes de distorsión, los cual nos permitirían revertir dicha distorsión en un post-procesado de la imagen. La distorsión causa que los puntos proyectados teóricos se desplacen en el plano de la imagen, y suele ser mayor al alejarse del centro. Figura 2-5. Tipos de distorsión más frecuentes Vamos a dividir la distorsión en dos componentes. La primera y más importante es la distorsión radial 𝛿. La segunda, que suele ser despreciable, es la distorsión tangencial 𝛿. La magnitud de ambos desplazamientos dependerá de la posición del punto proyectado con respecto al centro de la imagen. Lo primero que haremos será normalizar las coordenadas proyectadas con la distancia focal: 𝑥=𝑋𝑍=𝑥𝑓 𝑦=𝑌𝑍=𝑦𝑓 Aplicamos un desplazamiento a estas coordenadas en función de los coeficientes de distorsión. Con esto ya podemos obtener las coordenadas normalizadas distorsionadas 𝒑 : Modelo de la cámara 12 𝒑 =󰇩𝑥 𝑦󰇪=󰇣𝑥 𝑦󰇤∙𝛿+󰇩𝛿 𝑑󰇪 Siendo el término de la distorsión radial: 𝛿≈1+𝐾∙𝑟+𝐾∙𝑟+𝐾∙𝑟+⋯ Y el término de la distorsión tangencial: 󰇩𝛿 𝑑󰇪=󰇩2𝐾∙𝑥∙𝑦+𝐾(𝑟+2𝑥) 2𝐾∙𝑥∙𝑦+𝐾(𝑟+2𝑦)󰇪 Donde: 𝑟=𝑥+𝑦 Finalmente, lo único que queda por hacer es desnormalizar las coordenadas, para así tener las coordenadas proyectadas distorsionadas. Para ello multiplicamos por la distancia focal: 𝒑=𝑥 𝑦=󰇩𝑓∙𝑥 𝑓∙𝑦󰇪 Si disponemos de los coeficientes de distorsión, podemos usarlos para revertir la distorsión de una imagen. En nuestro caso los usaremos para aplicar un efecto simulado de distorsión a las imágenes sintéticas que vamos a generar. 2.3 Modelo completo Al calcular las coordenadas de esta manera hay que tener en cuenta que las coordenadas obtenidas pertenecerán a los números reales. Sin embargo, las cámaras reales tienen un número finito de píxeles, por lo que el siguiente paso es la discretización de dichas coordenadas para que pertenezcan a los números naturales. Esto significa pasar de metros a píxeles. Para ello simplemente dividimos las coordenadas obtenidas entre la dimensión efectiva del píxel. La dimensión efectiva horizontal, 𝜌 del píxel la obtendremos como el ancho del sensor 𝑤 dividido por el número de píxeles por fila 𝑁. Normalmente los píxeles son cuadrados, así que esto sería equivalente a dividir el alto del sensor ℎ entre el número de píxeles por columna 𝑀 (dimensión efectiva vertical, 𝜌). 𝜌=𝑤 𝑁 𝜌=ℎ 𝑀 13 13 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Además, por lo general, se establece el centro del sistema de coordenadas de la imagen en la esquina superior izquierda de la misma, por lo que habrá que añadir la distancia de la esquina de la imagen al centro, es decir, la mitad del número de píxeles por fila y columna, lo que se conoce como punto central de la imagen: 𝑢=𝑁2 𝑣=𝑀 2 Con esto nos queda la posición del punto proyectado en coordenadas de la imagen en píxeles (dejando a un lado la distorsión de momento), [𝑢,𝑣]: 𝑢=𝑥 𝜌+𝑢 𝑣=𝑦 𝜌+𝑣 Figura 2-6. Modelo completo de la cámara Todos los factores tenidos en cuenta hasta ahora se conocen como parámetros intrínsecos. Son parámetros que dependen exclusivamente de la cámara y averiguarlos en uno de los objetivos de la calibración de cámaras. Estos parámetros son:  La distancia focal. Normalmente será un parámetro variable que podremos modificar cambiando la lente de la cámara. Incluso algunas lentes permiten varias distancias focales, por lo que no tiene sentido calibrar una cámara sin fijar primero este parámetro. Hay que tener cuidado por ejemplo con las cámaras de los móviles ya que suelen disponer de enfoque automático. Debemos desactivar esta característica antes de proceder a la calibración.  El ancho y alto del sensor y el número de píxeles. Se asumen conocidos y dados por el fabricante y determinan la resolución de las imágenes tomadas por la cámara.  El punto central de la imagen. Es difícil que el centro del sensor esté perfectamente Modelo de la cámara 14 alineado con el eje óptico de la cámara, por lo que el punto central de la imagen cambiará de cámara a cámara, aun siendo del mismo modelo. Si la alineación fuese perfecta, este punto central tendría coordenadas [𝑢,𝑣]=[ , ].  Parámetros de distorsión de la lente 𝐾,𝐾,𝐾,𝐾,…. Al igual que el punto central, estos coeficientes variarán entre lentes del mismo modelo por errores en el proceso de fabricación. Existen otros parámetros importantes para modelar nuestro sistema multicámara y éstos son los parámetros extrínsecos, propios de la disposición relativa objeto/cámara. Como se aprecia en la Figura 2-6, las coordenadas de un objeto no estarán definidas en el sistema de coordenadas de la cámara, si no en coordenadas globales (W, world). La posición de la propia cámara estará a su vez definida en coordenadas globales. Por tanto, los parámetros extrínsecos se agrupan en una matriz de transformación 4x4 que nos servirá para transformar puntos desde coordenadas globales hasta coordenadas de la cámara, 𝑇 , compuesta de una matriz de rotación y un vector de traslación: 𝑇 =𝑅 𝑡  0 0 0 1 Si queremos proyectar un punto cuyas coordenadas las tenemos en el sistema global, 𝑷, primero deberemos transformar dichas coordenadas al sistema de la cámara empleando la matriz de parámetros extrínsecos: 𝑷= 𝑇 ∙𝑷 Con esto obtenemos el modelo completo de la cámara. Partimos de las coordenadas tridimensionales de un punto en el sistema de coordenadas global. Seguidamente las transformamos al sistema de coordenadas de la cámara y ya podemos proyectar el punto en el plano de la imagen usando la matriz de proyección K. Por último, discretizamos para obtener las coordenadas en píxeles. 𝑢󰆒 𝑣󰆒 𝑤󰆒= ⎣ ⎢ ⎢ ⎢ ⎡ 1 𝜌0 𝑢 01 𝜌𝑣 0 0 1 ⎦ ⎥ ⎥ ⎥ ⎤ 𝑓 0 0 0 0 𝑓 0 0 0 0 1 0∙ 𝑇 ∙𝑷 𝑢󰆒 𝑣󰆒 𝑤󰆒=𝐴∙ 𝑇 ∙𝑷 𝑢=𝑢󰆒 𝑤󰆒 𝑣=𝑣󰆒 𝑤󰆒 Siendo 𝒑=[𝑢,𝑣] las coordenadas en píxeles del punto proyectado. Hemos agrupado los dos primeros términos en la matriz de parámetros intrínsecos, 𝐴. 15 15 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos 𝐴= ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ 𝑓 𝜌0 𝑢 0𝑓 𝜌𝑣 0 0 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ =𝑓0 𝑢 0 𝑓𝑣 0 0 1 Donde 𝑓 y 𝑓 son la longitud focal efectiva horizontal y vertical respectivamente. Los parámetros de distorsión no están incluidos en A, ya que la distorsión la aplicaremos una vez hayamos generado la imagen. En el siguiente capítulo veremos cómo es el montaje experimental en el laboratorio. Analizaremos la disposición en el espacio de las cámaras (parámetros extrínsecos) y sus parámetros intrínsecos según el fabricante Con esta información ya estaremos listos para generar imágenes sintéticas del escenario de trabajo. Montaje experimental en el laboratorio 16 3 MONTAJE EXPERIMENTAL EN EL LABORATORIO n el siguiente capítulo procederemos a la generación de imágenes sintéticas, pero antes analizaremos el sistema real con el fin de simularlo lo mejor posible. El sistema montado en el laboratorio consta de cuatro cámaras de luz infrarroja, por lo que muestran imágenes monocromas. Las cámaras están montadas en los vértices de una estructura cúbica de 3x3x3m, todas con su eje óptico dirigido aproximadamente hacia el centro del cubo. Están colocadas de esta forma para maximizar su campo de visión global. Encima de cada cámara se ha colocado un foco de luz infrarroja que será reflejada por los objetos que vamos a localizar haciendo que resalten en las imágenes. El objetivo final del proyecto es usar este sistema para la localizar con alta precisión un objeto en tiempo real. Este objeto será una pequeña esfera cubierta de material retrorreflectante, un tipo de material que devuelve cualquier rayo de luz incidente en la dirección de la que provenga, sea cual sea. Es el mismo tipo de material que se utiliza en chalecos reflectantes o señales viales para hacer que parezcan brillantes a los conductores independientemente de su ángulo de aproximación. Se puede conseguir este efecto utilizando material reflectante siguiendo la geometría mostrada en la Figura 3-1.a y repetirla a muy pequeña escala a lo largo de la superficie que queramos convertir en retrorreflectante. Otra manera es colocando una capa de minúsculas esferas de cristal colocadas sobre una capa de pintura o pegamento, de modo que solo queden incrustadas hasta aproximadamente la mitad (Figura 3-1.b). Tras considerar ambos métodos, hemos optado por cubrir unas pelotas de ping-pong con cinta retrorreflectante por ser esta mucho más barata y su aplicación más sencilla. Figura 3-1. Fenómeno de retrorreflexión E 17 17 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Con este material y dado que los focos están colocados justo encima de las cámaras, conseguimos que su luz se refleje directamente desde las bolas hasta las cámaras y que las esferas aparezcan como puntos muy brillantes en las imágenes. Posteriormente al procesar las imágenes, estos objetos serán muy fáciles de distinguir del fondo. Una vez hemos detectado la esfera en la imagen tomada por cada una de las cuatro cámaras se podrán conocer con precisión las coordenadas tridimensionales de la bola. Hay que tener en cuenta que la toma de imágenes debe estar perfectamente sincronizada. Podemos fijar una de estas bolas a cualquier objeto que queramos localizar, por ejemplo, un dron, un vehículo terrestre o el efector final de un brazo robótico. De este modo conseguimos un sistema muy versátil, apto para un gran número de aplicaciones y escalable a mayores dimensiones. A continuación se muestran algunas fotos del sistema:  La estructura: Consta de una serie de vigas metálicas que forman un cubo de tres metros de alto, largo y ancho. Sobre estas vigas se colocan las cámaras y los focos infrarrojos, pudiéndose variar su altura. Figura 3-2. Estructura del sistema real  Las cámaras: Cuatro cámaras modelo “Genie Nano M1280-NIR”. Su sensor es de 1280 x 1024 píxeles y de ~6.4 x 4.8 mm. Su distancia focal es de 4.5 mm. Montaje experimental en el laboratorio 18 Figura 3-3. Cámaras empleadas  Los marcadores: Pelotas de ping-pong o similares recubiertas de material retrorreflectante. Figura 3-4. Marcadores retrorreflectantes  Los focos: Se trata de cuatro focos de luz infrarroja, cada uno colocado sobre una cámara. Tienen el objetivo de hacer resaltar los marcadores. 19 19 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 3-5. Focos de luz infrarroja  Ordenador: Ordenador central con el que controlamos el sistema, almacenamos y procesamos las imágenes. Generación de imágenes sintéticas 26 Figura 4-3. Proyección de las esquinas del patrón en cada cámara Lo único que queda por hacer es renderizar la imagen del patrón, aplicándole a dicha imagen una transformación geométrica para que las esquinas coincidan con los puntos proyectados y así tener una perspectiva correcta del patrón. La Figura 4-4 muestra uno de los patrones que vamos a utilizar para la calibración, el cuál se explicará en detalle en la sección 5.2. Figura 4-4. Patrón de calibración formado por ruido aleatorio Lo primero es cargar la imagen y definir las coordenadas de sus esquinas. Utilizamos la función fitgeotrans para obtener una transformación geométrica entre los puntos que tenemos y los que queremos. La función imwarp aplica dicha transformación y genera las cuatro imágenes: 27 27 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Lo último que queda por hacer es aplicar la distorsión de lente a las imágenes. Sabiendo las coordenadas “real” (sin distorsionar) de un píxel, podemos usar el modelo matemático de distorsión de lente para saber cuáles serían las coordenadas distorsionadas de dicho punto. Simplemente aplicamos el desplazamiento a las coordenadas según las ecuaciones de la sección 2.2. % Cargamos la imagen del patron patron = imread('C:\Users\marco\OneDrive - UNIVERSIDAD DE SEVILLA \Calibraciones\1754x1240.png'); % Para usar la función fitgeotrans necesitamos las coordenadas de las esquinas del patron en la imagen en el siguiente % orden: % Esquina inferior izquierda (xmin, ymax) % Esquina superior izquierda (xmin, ymin) % Esquina superior derecha (xmax, ymin) % Esquina inferior derecha (xmax, ymax) % Imagen patrón 1754x1240 xmin = 0; ymin = 0; [ymax, xmax] = size(patron); c = [xmin xmin xmax xmax]'; % Vector de columnas r = [ymax ymin ymin ymax]'; % Vector de filas img = double(img); % Para evitar errores de desbordamiento al manipular las % coordenadas de los pixeles % Tamaño deseado para las imágenes generadas Rinput = imref2d([M N 1]); % Coordenadas deseadas para las esquinas movingPoints1 = pix1'; movingPoints2 = pix2'; movingPoints3 = pix3'; movingPoints4 = pix4'; % Creamos matrices de transformacion para las imagenes tform1 = fitgeotrans([c r], movingPoints1, 'projective'); tform2 = fitgeotrans([c r], movingPoints2, 'projective'); tform3 = fitgeotrans([c r], movingPoints3, 'projective'); tform4 = fitgeotrans([c r], movingPoints4, 'projective'); % Transformamos las imagenes img1 = imwarp(img, tform1, 'OutputView', Rinput); img2 = imwarp(img, tform2, 'OutputView', Rinput); img3 = imwarp(img, tform3, 'OutputView', Rinput); img4 = imwarp(img, tform4, 'OutputView', Rinput); Generación de imágenes sintéticas 28 % Doble bucle para recorrer todos los pixeles de la imagen for v = 1:size(img1,1) for u = 1:size(img1,2) % Obtenemos coordenadas normalizadas xn = (u - u0)/fx; yn = (v - v0)/fy; % Distancia al centro de la imagen (al cuadrado) r2 = (xn^2)+(yn^2); % Calculamos donde caeria el pixel distorsionado xnd = xn*(1 + kr1*r2 + kr2*r2^2 + kr3*r2^4 + kr4*r2^6); ynd = yn*(1 + kr1*r2 + kr2*r2^2 + kr3*r2^4 + kr4*r2^6); % Desnormalizamos ud = xnd*fx + u0; vd = ynd*fy + v0; % Estas coordenadas seran numeros reales. Podemos aproximarlas % a las del pixel mas cercano o utilizar una mezcla de los % colores de los cuatro pixeles mas cercanos en la imagen real % (interpolacion bilineal) % Realizamos la interpolacion bilineal % Utilizando floor y ceil buscamos los % dos vecinos mas cercanos tanto por arriba e % izquierda como por abajo y derecha. vd1 = floor(vd); vd2 = ceil(vd); ud1 = floor(ud); ud2 = ceil(ud); % Si las coordenadas obtenidas caen dentro de la imagen, % rellenamos el pixel con una mezcla del color de los cuatro % pixeles mas cercanos (de la imagen sin distorsionar) if(vd1>0 && ud1>0 && vd1<=size(img1,1) && ud1<=size(img1,2) && vd2>0 && ud2>0 && vd2<=size(img1,1) && ud2<=size(img1,2)) bloque1 = ((vd2-vd)*(ud2-ud)*img1(vd1,ud1) +... (vd2-vd)*(ud-ud1)*img1(vd1,ud2) +... (vd-vd1)*(ud2-ud)*img1(vd2,ud1) +... (vd-vd1)*(ud-ud1)*img1(vd2,ud2)); img1_dist(v, u) = (1/((vd2-vd1)*(ud2-ud1))) * bloque1; bloque2 = ((vd2-vd)*(ud2-ud)*img2(vd1,ud1) +... (vd2-vd)*(ud-ud1)*img2(vd1,ud2) +... (vd-vd1)*(ud2-ud)*img2(vd2,ud1) +... (vd-vd1)*(ud-ud1)*img2(vd2,ud2)); img2_dist(v, u) = (1/((vd2-vd1)*(ud2-ud1))) * bloque2; bloque3 = ((vd2-vd)*(ud2-ud)*img3(vd1,ud1) +... (vd2-vd)*(ud-ud1)*img3(vd1,ud2) +... (vd-vd1)*(ud2-ud)*img3(vd2,ud1) +... (vd-vd1)*(ud-ud1)*img3(vd2,ud2)); img3_dist(v, u) = (1/((vd2-vd1)*(ud2-ud1))) * bloque3; bloque4 = ((vd2-vd)*(ud2-ud)*img4(vd1,ud1) +... (vd2-vd)*(ud-ud1)*img4(vd1,ud2) +... (vd-vd1)*(ud2-ud)*img4(vd2,ud1) +... (vd-vd1)*(ud-ud1)*img4(vd2,ud2)); img4_dist(v, u) = (1/((vd2-vd1)*(ud2-ud1))) * bloque4; 29 29 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos En la siguiente figura vemos el resultado: Figura 4-5. Proyección del patrón distorsionado Finalmente vamos a darle algo de realismo a las imágenes. Vamos a sustituir el fondo negro por un fondo estático de una habitación distinto para cada cámara y además vamos a añadir algo de ruido gaussiano. Para ello recorremos cada fila de la imagen de izquierda a derecha, buscando el primer píxel no negro. Cuando lo encontremos, sustituimos todos los píxeles a la izquierda de dicho píxel por los equivalentes de la imagen de fondo. Repetimos recorriendo de derecha a izquierda. Este método no es perfecto ya que puede que los bordes del patrón en algunas zonas sean negros, haciendo que esos píxeles se conviertan en el fondo cuando realmente pertenecen al patrón, como se aprecia en la siguiente imagen. else img1_dist(v, u) = 127; img2_dist(v, u) = 127; img3_dist(v, u) = 127; img4_dist(v, u) = 127; end end end % Reconvertimos las imagenes a entero sin signo de 8 bits img1_dist = uint8(img1_dist); img2_dist = uint8(img2_dist); img3_dist = uint8(img3_dist); img4_dist = uint8(img4_dist); Generación de imágenes sintéticas 30 Figura 4-6. Detalle de borde negro Para aplicar el ruido gaussiano, simplemente usamos la función de Matlab “imnoise” y ajustamos los parámetros hasta conseguir el resultado que queremos. % Añadimos ruido img1_ruido = imnoise(img1_final, 'gaussian',0,0.0002); img2_ruido = imnoise(img2_final, 'gaussian',0,0.0002); img3_ruido = imnoise(img3_final, 'gaussian',0,0.0002); img4_ruido = imnoise(img4_final, 'gaussian',0,0.0002); 31 31 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 4-7. Imágenes sintéticas finales Figura 4-8. Detalle del ruido en la imagen Calibración del sistema 32 5 CALIBRACIÓN DEL SISTEMA l problema de la calibración de cámaras es un paso necesario para operar cualquier sistema que utilice cámaras y ha sido ampliamente estudiado. La idea básica es tomar imágenes de un objeto cuya geometría sea conocida con exactitud. Sabiendo como debería mostrarse el objeto en la imagen y como se muestra realmente, podemos descubrir los parámetros internos de las cámaras haciendo uso del modelo matemático visto en el capítulo 2. Inicialmente se utilizaban objetos tridimensionales, por ejemplo, un cubo o tres varillas ortogonales entre sí, y se tomaban múltiples vistas de dicho objeto. La desventaja que esto tiene es la difícil obtención de un objeto de estas características, con 3 planos perfectamente perpendiculares y de medidas precisas. En 1998, Zhengyou Zhang introdujo una nueva metodología de calibración basada en un patrón plano (5), como el que hemos visto en el capítulo anterior. Esta técnica es mucho más flexible y sencilla de utilizar, por lo que se ha convertido en un estándar, aunque aún se siguen utilizando varillas de calibración en algunos sistemas comerciales. Desde entonces han surgido múltiples implementaciones con diferentes patrones, cada uno de los cuales presenta ventajas e inconvenientes. En este capítulo vamos a comprobar el funcionamiento de tres “toolboxes” de MATLAB para calibración de cámaras (y sistemas multicámara), cuyo código está abierto y disponible online. Dos de los toolboxes que veremos a continuación siguen el mismo procedimiento básico:  Imprimimos el patrón de calibración y lo adherimos a una superficie plana y rígida para evitar que se curve.  Tomamos imágenes del patrón desde diferentes perspectivas. Intentaremos utilizar posiciones y orientaciones bastante distintas entre sí.  Detectar las features 1 del patrón en cada imagen. Dichas “features” (características) serán una serie de puntos que formará un plano en el espacio tridimensional. Como conocemos la geometría del patrón, conocemos las distancias entre los puntos y midiendo dichas distancias en las imágenes podremos determinar los parámetros intrínsecos y extrínsecos de las cámaras.  Estimar los parámetros intrínsecos y extrínsecos imponiendo una serie de ecuaciones y restricciones geométricas y posteriormente los parámetros de distorsión radial.  Refinar la solución de forma iterativa. El tercero opera de forma diferente. En lugar de mover un patrón a lo largo de la escena, lo que se mueve es un puntero láser. Esto implica que sólo habrá una característica en cada imagen en comparación a las decenas, cientos e incluso miles que pueden contener los patrones utilizados 1 En visión por computador, una “feature” es un trozo de información relevante para resolver una tarea para una aplicación determinada. Pueden ser puntos, contornos, esquinas, etc. En nuestro caso las utilizaremos para definir el plano sobre el que se encuentra el patrón de calibración y para relacionar que puntos 2D en cada una de las cuatro imágenes corresponde al mismo punto 3D. E 33 33 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos por los otros dos programas. El objetivo de comparar estos tres toolboxes es comprobar si alguno de ellos ofrece resultados significativamente mejores para la disposición de nuestro sistema, ya que cada uno está diseñado para un objetivo concreto. El primer toolbox está diseñado para sistemas de cámaras estéreo, en los que solo hay dos cámaras cuyos ejes ópticos se cortan en un punto. Podemos adaptarlo a nuestro sistema si realizamos la calibración de las cuatro cámaras en parejas. El segundo está pensado para sistemas con cualquier número de cámaras cuyos ejes ópticos no intersecan y por tanto sus campos de visión se superponen poco. Dado que está pensado para funcionar en un entorno tan poco favorable, creemos que puede ser interesante utilizarlo para un sistema como el nuestro, donde tiene posibilidades de dar muy buenos resultados. A continuación, se procede a explicar cada toolbox por separado. 5.1 Calibración basada en tablero de ajedrez (Jean-Yves Bouguet 1999) (6) Este toolbox está basado en la metodología introducida por Zhengyou Zhang. Aunque es algo antiguo, ha sido actualizado y utilizado ampliamente a lo largo de los años y ofrece un método de calibración simple y con buenos resultados. El patrón utilizado se muestra en la Figura 5-1 (o uno similar con distinto número de filas y columnas): Figura 5-1. Patrón de calibración para el algoritmo de Bouguet Las esquinas de los cuadrados se utilizan como características. Como podemos ver se trata de un patrón sencillo de obtener, aunque presenta algunas desventajas. En primer lugar, se requiere que todo el patrón sea visible en cada imagen, lo que nos limita a la hora de generar posiciones aleatorias para el patrón ya que no se puede salir de la imagen de ninguna de las cámaras. Además, el toolbox no incluye un algoritmo de detección de esquinas automático (feature detection), por lo que hay que seleccionar manualmente dónde se encuentran las cuatro esquinas exteriores del patrón en cada imagen, indicar el número de filas y columnas y el lado de los cuadrados, y el algoritmo estimará la ubicación del resto de esquinas. Esto, sumado a que solo se puede realizar la calibración de un par de cámaras simultáneamente (está pensado para sistemas estéreo) implica que tendremos que realizar mínimo tres calibraciones distintas, lo cual hace que el proceso sea bastante laborioso. Calibración del sistema 34 5.1.1 Metodología de calibración Procedemos a explicar cómo se realizaría la calibración de una cámara.  Paso 1. Descargamos el toolbox desde la web: http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html  Paso 2. Imprimir el patrón, el cual lo encontraremos en los archivos descargados y adherirlo a una superficie rígida. Tomar las imágenes que necesitemos mientras movemos el patrón por la escena. En el caso de la simulación, generamos las imágenes sintéticas del patrón de calibración. Las guardamos en 3 carpetas, cada una para una pareja de cámaras (1-2, 1-3 y 1-4). Dentro de cada carpeta las guardamos con el formato “left’Número de imagen’.png” y “right’Número de imagen’.png” (por ejemplo “left3.png”, “right7.png”, etc). La “left” será siempre la primera cámara mientras que la “right” será la otra. Vamos a calibrar, por ejemplo, la pareja de cámaras 1-2.  Paso 3. Añadimos la carpeta descargada al “Path” de Matlab, nos colocamos en la carpeta que contiene las imágenes, ejecutamos el script calib_gui y marcamos “Standard”: Figura 5-2. Calibración primer toolbox, tercer paso  Paso 4. Pulsamos en “Images names” en el menú que aparece: Figura 5-3. Calibración primer toolbox, cuarto paso Debemos de realizar la calibración de las cámaras de una en una. Así que empezamos indicando que el nombre base es “left” y el formato jpg. 35 35 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 5-4. Calibración primer toolbox, cuarto paso (2)  Paso 5. Marcamos “Extract grid corners”. Dejamos por defecto todo lo que nos pide. Figura 5-5. Calibración primer toolbox, quinto paso Ahora nos irán apareciendo las imágenes y tenemos que ir marcando las cuatro esquinas exteriores del patrón, siempre en el mismo orden (se ha colocado una marca en una de las esquinas para asegurarnos de que estamos marcando siempre en el mismo orden). Figura 5-6. Calibración primer toolbox, quinto paso (2) Calibración del sistema 42 intrínsecos de cada cámara (distancia focal efectiva horizontal y vertical, punto principal de la imagen y coeficientes de distorsión) y los parámetros extrínsecos (matrices de transformación del sistema de coordenadas de la primera cámara con respecto a todas las demás). Además, se generan dos figuras, una que muestra las posiciones de las cámaras y de las imágenes y un diagrama que muestra qué imágenes se han utilizado para calibrar cada cámara. No todas las imágenes se utilizan para calibrar todas las cámaras ya que debido a su distribución es difícil que para una determinada posición del patrón las cuatro cámaras tengan una buena perspectiva de este. Figura 5-22. Error de reproyección medio y parámetros intrínsecos 43 43 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 5-23. Parámetros extrínsecos Figura 5-24. Representación gráfica de los parámetros extrínsecos, tanto de los patrones como de las cámaras Calibración del sistema 44 Figura 5-25. Patrones vistos por cada cámara Las unidades del vector de traslación en la figura Figura 5-23 no son metros ni milímetros, sino píxeles. Para obtener el valor en metros, multiplicamos por la altura del patrón en metros (podemos elegirla al generar las imágenes sintéticas) y dividimos por la altura del patrón en píxeles (podemos elegirla al generar el patrón). 5.3 Calibración basada en puntero láser (Tomas Svoboda et al. 2005) (8) Este Toolbox para Matlab es muy diferente de los anteriores. La calibración del sistema multicámara se realiza utilizando imágenes tomadas mientras agitamos un punto de luz por la escena. El proceso de generación de imágenes es por tanto mucho más sencillo. Simplemente habrá que generar una posición (aleatoria) de un punto dentro del espacio de trabajo, proyectar dicho punto en cada cámara y crear un pequeño rectángulo o círculo blanco en dicha posición. Nos indican que para que la herramienta funcione correctamente hay que asegurarse de que se toma la imagen en un ambiente oscuro, o que se baje la sensibilidad de las cámaras. De esta manera, el punto de luz resalta más en las imágenes y es más fácil de detectar. Aquí podemos ver un ejemplo de cómo quedaría la imagen: 45 45 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 5-26. Ejemplo de imagen oscurecida con puntero láser. Como podemos ver, el punto de luz es blanco, aunque el toolbox nos permite elegir el color que queramos. Esto es útil para sistemas con cámaras a color, si se utiliza un puntero láser rojo o verde. Sin embargo, no hay que olvidar que en el sistema real utilizamos cámaras que generan imágenes monocromas. Este toolbox promete una calibración precisa sin necesidad de imprimir un patrón ni de crear un objeto tridimensional complejo, por lo que podría sernos muy útil. No es necesario que el láser se vea en todas las cámaras simultáneamente. Al igual que el anterior, dispone de una rutina de detección automática de puntos. Por tanto el proceso es completamente automático y muy sencillo y rápido de ejecutar. 5.3.1 Metodología de calibración  Paso 1: El toolbox se descarga desde este enlace: http://cmp.felk.cvut.cz/~svoboda/SelfCal/index.html  Paso 2: Generamos las imágenes sintéticas. Las imágenes de cada cámara se guardan por separado y se le añade al final el número que indica el fotograma.  Paso 3: En la carpeta que hemos descargado, tenemos que editar los ficheros “/CommonCfgAndIO/expname.m” y “/CommonCfgAndIO/configdata.m”. Dentro de expname.m tenemos que descomentar el nombre correspondiente a nuestro experimento. En nuestro caso hemos usado “TestData”, pero podemos escoger cualquiera: Calibración del sistema 46 Figura 5-27. Fichero "expname.m"  Paso 4: Editamos configdata.m. En este fichero hay múltiples parámetros que editar. Los más relevantes son: o config.paths.data: La ubicación de la carpeta que contiene las imágenes. o config.files.basename: El nombre base de las imágenes. o config.files.idxcams: El id de las cámaras (número que identifica a cada una). En nuestro caso serán [1, 2, 3, 4] o config.imgs.LEDsize: El diámetro medio en píxel del punto de luz en las imágenes. Por defecto es cinco. o config.imgs.LEDcolor: El color del punto de luz. Blanco en nuestro caso. El resto de los parámetros se explican en la documentación del toolbox. 47 47 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 5-28. Fichero "configdata.m"  Paso 5: Accedemos al directorio “/MultiCamSelfCal/FindingPoints/” y ejecutamos el script “im2points.m”. Este script se encarga de la detección del puntero láser en cada una de las imágenes. Utiliza un método bastante rápido pero robusto y no hay problemas con falsas detecciones. Si lo ejecutamos sobre 1500 imágenes monocromas (los autores recomiendan mínimo 100 imágenes): Calibración del sistema 48 Figura 5-29. Resultados de “im2points.m”  Paso 6: Desde el directorio ““/MultiCamSelfCal/” ejecutamos el script “gocal.m”. Este es el programa que se encarga de realizar la calibración, generar ficheros y algunas gráficas de resultados: o Error de reproyección medio y desviación estándar por cámara. Aparentemente la calibración ha sido exitosa y tenemos un error de reproyección medio inferior a 0.3 píxeles. 49 49 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 5-30. Error de reproyección medio por cámara. o Puntos reales frente a reproyectados. Ubicación de los puntos de luz en las imágenes (círculos azules), y ubicación de esos mismos puntos según el modelo del sistema generado por la calibración (cruces azules). Los círculos rojos son puntos descartados. Figura 5-31.- Puntos reales frente a reproyectados o Reconstrucción de la ubicación y orientación de las cámaras. Podemos ver en la siguiente imagen que algo falla, ya que todos los puntos (círculos rojos) deberían estar dentro de los 9 metros cúbicos de nuestro espacio de trabajo. Calibración del sistema 50 Figura 5-32. Reconstrucción de las ubicaciones de las cámaras Si nos acercamos para ver el detalle de la posición de las cámaras: Figura 5-33. Detalle de las posiciones de las cámaras Las cámaras están representadas con un círculo azul, y la dirección de su eje óptico con una línea azul. Además, se indica el número de cada cámara. A priori la ubicación de las cámaras parece la correcta, ya que forman un cuadrado. Sin embargo, la distancia entre ellas es muy inferior a 3 metros y aparentemente la rotación relativa entre ellas es nula. Además, si observamos los datos de los parámetros intrínsecos de las cámaras podemos ver que están completamente desviados. La distancia focal efectiva horizontal (𝑓) y vertical (𝑓) se estiman como 3.6 y 2.6 respectivamente. Las reales son: 51 51 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos 𝑓=𝑓∗𝑁 𝑤=0.0045∗ 1280 0.006144=𝟗𝟑𝟖.𝟐 𝑓=𝑓∗𝑀 ℎ=0.0045∗ 1024 0.004915=𝟗𝟑𝟖.𝟒 El punto central de la imagen ([𝑢,𝑣]) sí se estima correctamente, pero los parámetros de distorsión no. Si comparamos los parámetros extrínsecos, vemos que la matriz de transformación entre la cámara 1 y la 2 real es: 𝑐1𝑇𝑐2=1 0 0 0 0 0 −1 3 0 1 0 3 0 0 0 1 Y la que obtenemos de la calibración: 𝑐1𝑇𝑐2=1 0.005 −0.002 0.0390 −0.005 0.9999 0.0092 6.6398 0.002 −0.0092 1 −2.8319 0 0 0 1 ~1 0 0 0.0390 0 1 0 6.6398 0 0 1 −2.8319 0 0 0 1  Es decir, que no hay apenas rotación relativa entre ambas cámaras y el vector de translación es totalmente erróneo. Lo mismo ocurre para el resto de las cámaras. Estos resultados no nos sirven así que vamos a intentar solucionarlo. El hecho de que el error de reproyección sea tan bajo nos da a entender que el proceso de calibración tiene múltiples resultados válidos posibles, debido a la gran cantidad de parámetros que se pueden modificar (Seis para la posición y orientación de las cámaras, cinco para los parámetros intrínsecos de las cámaras y al menos uno para los parámetros de distorsión) y que quizá un solo punto por imagen no aporte información suficiente para poder calibrar el sistema correctamente. Lo primero que haremos será intentar mejorar la detección de puntos. Probamos diferentes tamaños del puntero láser, estableciendo el diámetro entre 3 y 20 píxeles para ver si un láser más grande tiene mejores resultados (los resultados anteriores se han conseguido para un diámetro de 5 píxeles). Por desgracia los resultados no mejoran y 5 píxeles parece ser el tamaño perfecto (y el que aparece como predeterminado). A más grande el puntero láser, menos puntos son detectados. Sin embargo, sí que se mejora la detección de puntos usando imágenes a color, con un puntero láser verde sobre un fondo oscuro. Haciendo esto se detectan casi el 100% de los puntos. El problema es que el proceso de generación de imágenes es mucho más lento por lo que no es viable utilizar tantas. En la siguiente figura se muestran los puntos detectados en 150 imágenes a color: Calibración del sistema 58 disposición o la distancia focal de las cámaras sea diferente. Es decir, si acercásemos las cámaras al centro del volumen de trabajo o si aumentáramos su distancia focal entonces no necesitaríamos un patrón tan grande. Lo primero que tenemos que saber es que la distancia focal guarda una relación proporcional con el zoom. Un objeto fotografiado a cierta distancia con una focal determinada ocupará el mismo espacio en la imagen que si se encontrase al doble de distancia y la distancia focal fuese también el doble. Por tanto, si calculamos la distancia desde la ubicación de una cámara hasta el origen del sistema, esto es, la distancia media desde una cámara hasta el centro del patrón: 𝐷=1.5+1.5+3≈3.67 𝑚 Y la diagonal del patrón elegido: 𝑑𝑖𝑎𝑔=2.192+1.55≈2.68 𝑚 Podemos establecer una relación entre estas dos distancias y la distancia focal. 𝑓∗𝑑𝑖𝑎𝑔 𝐷=𝐾 Siendo 𝐾 una constante cuyo valor aproximado es 𝐾=0.0045 ∗2.68/3.67~0.003 𝑚. Mediante esta relación podemos ver que, si por ejemplo utilizamos un patrón el doble de pequeño (que su diagonal mida la mitad), tendremos que duplicar también la distancia focal o acercar las cámaras hasta que estén a un metro y medio del origen. Si queremos ampliar el sistema colocando las cámaras a más distancia entre sí, tendremos que aumentar el tamaño del patrón de manera acorde. Hay que tener en cuenta que la distancia focal también influye en el ángulo de visión de las cámaras. Así que si aumentamos la distancia focal nuestro volumen de trabajo se verá reducido. Es recomendable por tanto reducir f lo máximo posible. Con respecto al toolbox de Bouguet, dado las características tendremos que seleccionarlas manualmente, no será necesario utilizar un patrón tan grande. Como ya hemos visto, repartir las características a lo largo de un mayor espacio en la imagen puede causar un aumento del error de reproyección así que si queremos utilizar un patrón de mayor tamaño también tendremos que aumentar el número de cuadrados. En las pruebas que se han realizado, utilizar cuadrados con unos 20 mm de lado parece ser suficiente. Además, cuanto más grande sea el patrón más probabilidades habrá de que se salga del encuadre de las cámaras, volviendo inútil dicha imagen. Por tanto, será recomendable un patrón de menor tamaño. Eso sí, habrá que asegurarse de que el patrón esté colocado en todas las zonas de la imagen, no solo en el centro lo cual requerirá de más imágenes cuanto más pequeño sea el patrón. Si no se hace así, los parámetros de distorsión, cuyos efectos se notan más en los bordes de la imagen, no se estimarán de forma correcta. Por tanto el tamaño recomendado para el patrón de este toolbox es entre un formato A1 y un A0, con cuadrados de al menos 30 milímetros de lado. 5.4.1.2 Error de reproyección en función de la resolución del patrón. Ahora que sabemos que tamaños mayores para el patrón nos proporcionan mejores resultados, vamos a tratar de averiguar cuál será la resolución óptima para un tamaño determinado. O de 59 59 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos forma más general, cuales son los PPcm óptimos. Para este experimento seguiremos el mismo procedimiento que para los dos anteriores, pero esta vez mantendremos el tamaño del patrón fijo mientras que variamos su resolución. Mediante esta prueba estamos buscando cuántos píxeles por centímetro son óptimos. Utilizaremos el tamaño elegido anteriormente, 2.192 x 1.55 metros y generaremos 20 grupos de 20 imágenes por cámara para cada resolución. Los resultados se muestran en la siguiente gráfica: Figura 5-38. Error de reproyección en función de la resolución del patrón Podemos sacar dos conclusiones de esta figura. La primera es que con resoluciones menores se consigue un error claramente mayor, aunque también se consiguen calibraciones exitosas con mayor frecuencia. El motivo es posiblemente el mismo que cuando aumentábamos el tamaño sin aumentar la resolución en el apartado anterior. Hay muy pocas características ocupando gran parte de la imagen y por tanto están muy separadas entre sí. Esto hace que la distorsión de la lente les afecte más y por tanto la precisión de la calibración se ve afectada. Para conseguir una mayor precisión, deberemos tener una gran densidad de características en una región delimitada de la imagen. De la misma manera que podemos aproximar mejor una circunferencia bidimensional cuando más puntos tengamos que pertenezcan a dicha circunferencia, también podremos aproximar la forma de un plano tridimensional mucho mejor cuantos más puntos pertenecientes al plano tengamos. La segunda conclusión es que existe un límite superior a partir del cual apenas se consiguen realizar calibraciones. Para una resolución de 2631 x 1860 píxeles, es decir, 𝑃𝑃𝑐𝑚=12 solo un 25% de las calibraciones ha dado resultado. Por eso, aun siendo el error medio más bajo obtenido hasta ahora, no podemos tenerlo en cuenta. La causa más probable es que comprimir demasiadas características en un espacio demasiado pequeño hará que estas se emborronen y se mezclen a la hora de tomar la imagen, sobre todo si tenemos en cuenta que la resolución de nuestra cámara no 0,7032 0,6740 0,6269 0,5950 0,5488 0,5307 0,5072 0,0710 0,1607 0,1659 0,1222 0,0741 0,0877 0,0836 1 0,95 0,75 0,95 0,9 0,85 0,25 0 0,2 0,4 0,6 0,8 1 0 0,2 0,4 0,6 0,8 1 877x620 1315x930 1578x1116 1754x1240 1929x1364 2192x1550 2631x1860 Porcentaje (por unidad) Error de reproyección (píxeles) Resolución del patrón (píxeles) Media Desviación estándar Porcentaje de calibraciones exitosas Calibración del sistema 60 es demasiado elevada. Por tanto, al algoritmo de detección automática le resultará prácticamente imposible reconocer el patrón en las imágenes. En resumen, lo que nos dice esta gráfica es que un valor de 10 píxeles por centímetro parece ser lo más adecuado. Por tanto, de ahora en adelante usaremos una imagen de 2192 x 1550 píxeles para el patrón de 2.192 x 1.55 metros. Con respecto al toolbox de Bouguet, simplemente debemos asegurarnos de que la resolución del patrón sea suficiente para que las esquinas del tablero de ajedrez aparezcan bien definidas en las imágenes. Y como se ha especificado anteriormente, mantener una densidad de cuadrados suficiente. 5.4.1.3 Error de reproyección en función del número de imágenes usadas. Hasta ahora hemos estado utilizando grupo de 20 imágenes por cámara. Sin embargo, en el artículo de Zhengyou Zhang (5) se establece que solo son necesarias dos imágenes correctamente detectadas para la calibración de un sistema multicámara, siempre y cuanto el patrón de calibración no esté sobre el mismo plano en ambas imágenes, es decir, que el patrón debe tener una orientación distinta en cada imagen. Por tanto, más de tres imágenes no proporcionan información adicional y teóricamente no deben de mejorar los resultados de la calibración. Sin embargo, la mayoría de las imágenes no nos serán útiles, principalmente debido a orientaciones no favorables del patrón. Por lo general nos servirán entre un 20% y un 60% de las imágenes. Por otro lado, también nos puede resultar útil añadir cierta redundancia para compensar el ruido simulado que hemos introducido en las imágenes. Podemos ver en la siguiente gráfica que un mayor número de imágenes nos permite mejorar tanto el error de reproyección medio como el porcentaje de calibraciones exitosas, a costa de una mayor duración de la calibración. Sin embargo, si tenemos tiempo y queremos obtener la máxima precisión posible, es recomendable utilizar el mayor número posible de imágenes. 61 61 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos Figura 5-39. Error de reproyección en función del número de imágenes usadas en la calibración Para el toolbox de Bouguet la situación es diferente. Aunque introduzcamos 50 imágenes por cámara en la calibración, solamente se utilizarán entre 10 y 30. Sin embargo en el programa de Bouguet solo podemos introducir imágenes que sepamos que sean válidas. Así que usar entre 10 y 20 buenas imágenes será más que suficiente. 5.4.2 Comparación de resultados Una vez que hemos recopilado esta información estamos listos para comparar ambos toolboxes y descubrir cuál puede darnos una mejor calibración. Primero tenemos el toolbox de Boli. Hemos utilizado 50 imágenes por cámara, con un patrón de 2.192 x 1.55 metros y una resolución de 2192 x 1550 píxeles. Para el toolbox de Bouguet únicamente hemos utilizado 15 imágenes por cámara. La resolución de este patrón era de 1595 𝑥 1240 𝑝𝑖𝑥 por lo que sus medidas serán de 1.5330 𝑥 1.1925 𝑚 para mantener la relación de aspecto. Para ambos hemos realizado varias calibraciones buscando el menor error de reproyección posible. En la siguiente tabla se exponen los resultados: 0,5683 0,5510 0,5282 0,1112 0,0736 0,0779 0,4 0,8 0,9 0 0,2 0,4 0,6 0,8 1 0 0,2 0,4 0,6 0,8 1 10 20 50 Porcentaje (por unidad) Error de reproyección Número de imágenes Media Desviación estándar Porcentaje de calibraciones exitosas Calibración del sistema 62 toolbox Bo Li toolbox Bouguet Camara 1 Camara 2 Camara 3 Camara 4 Camara 1 Camara 2 Camara 3 Camara 4 Error de posición (m) - 0.103 0.011 0.007 - 0.128 0.104 0.026 Error de posición (%) - 3.43 0.37 0.23 - 4.27 3.47 0.87 Error de rotación ( ° ) - 1.09 0.17 0.46 - 1.38 2.46 1.55 Error de la distancia focal efectiva (%) 𝑓  0.30 2.41 0.19 0.22 0.55 1.67 1.27 0.44 𝑓  0.28 2.25 0.30 0.20 0.21 1.60 1.35 0.65 Error del punto principal (%) 𝑢  0.01 2.4 0.29 0.61 1.5 3.13 2.24 0.86 𝑣  0.12 3.05 0.8 0.32 2.15 0.85 5.97 0.36 Error de los coeficientes de distorsión (%) 𝑘   0.36 4.30 1.99 1.55 35.00 24.73 10.95 15.67 𝑘   102.38 116.15 110.01 109.91 338.75 287.10 194.39 241.53 𝑘   100.19 99.58 99.58 99.52 96.30 98.39 96.37 99.28 𝑘   100.47 99.69 100.44 100.52 105.14 97.16 98.34 104.20 Error de reproyección (pix) 0.4789 0.3065 Tiempo empleado ~ 5 min ~ 30 min Tabla 5-1. Comparación de los resultados de la calibración. Podemos determinar que los resultados son buenos basándonos en que el error de reproyección está por debajo del medio píxel. Esto implica que un mismo punto proyectado en la cámara real o usando los parámetros que nos da la calibración caerá dentro del mismo píxel. Aun así, esta tabla es algo confusa así que vamos a analizarla fila por fila. Empezamos por los parámetros extrínsecos. Para el toolbox de Bo Li el error de posición se encuentra entre los 0.7 y 10.3 cm y para el de Bouguet entre los 2 y 12.8 cm. Ambos están en el mismo orden de magnitud, aunque el de Bo Li parece ligeramente mejor. Algo similar ocurre con el error de rotación, mismo orden de magnitud, pero el toolbox de Bo Li tiene errores inferiores. Seguimos con los parámetros intrínsecos. El error de la distancia focal efectiva (tanto vertical como horizontal) medio es de 0.77% para el toolbox de Bo Li y de 0.97% para el de Bouguet. El error del punto principal medio es de 0.95% para Bo Li y 2.13% para Bouguet. En los coeficientes de distorsión si se aprecia una diferencia notable. Ambas calibraciones 63 63 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos únicamente estiman bien el primer coeficiente, mientras que el error es del 100% para los demás. Sin embargo, este primer coeficiente es estimado mucho mejor por el toolbox de Bo Li que por el de Bouguet. Aún con todo esto, el error de reproyección es, por algún motivo, inferior para el toolbox de Bouguet. Esto puede deberse a que no exista una solución única debido al gran número de parámetros que pueden variar. Así que, aunque el toolbox de Bouguet de un menor error de reproyección, parece que los parámetros del sistema son estimados algo mejor por el de Bo Li. Pero siendo ambos errores tan pequeños no va a haber una diferencia apreciable entre estos dos toolboxes. Por tanto, el factor decisivo es sin duda el tiempo empleado para cada una de las calibraciones. Esto hace que nos decantemos por el toolbox de Bo Li para realizar la calibración del sistema real. 6 CONCLUSIONES Y CONTINUACIÓN DEL PROYECTO Conclusiones y continuación del proyecto 64 n este breve capítulo vamos a tratar de agrupar las conclusiones obtenidas trabajando con un sistema simulado, y algunas posibles mejoras futuras para el proyecto. Hemos logrado obtener una gran precisión a la hora de calibrar el sistema. Esto se traducirá directamente en una gran precisión a la hora de ubicar las balizas dentro de nuestro espacio de trabajo. Si trabajamos con balizas móviles, la precisión se verá también afectada por la velocidad de nuestro sistema. Habría que medir el número de fotogramas que pueden procesarse por segundo (esto incluye toma de las imágenes, transmisión al ordenador central y obtención de coordenadas 3D) para así establecer un límite a la velocidad de movimiento del objeto a localizar. Con respecto a la calibración de sistemas multicámara, podemos sacar varias conclusiones como son:  Que son suficientes dos perspectivas diferentes de un mismo objeto planar para obtener una calibración precisa. Aumentar el número de perspectivas no tiene un efecto significativo en el error de reproyección y tan sólo aportan información redundante.  Que, siendo la calibración un proceso que muy probablemente tengamos que realizar múltiples veces durante la vida útil del sistema, es muy beneficioso contar con un método que incluya detección automática de características para reducir el tiempo empleado.  Que existe una relación clara entre el tamaño con el que el patrón aparece en las imágenes (depende del tamaño del propio patrón y la distancia a las cámaras) y la cantidad de características que contiene. Muy pocas características nos darán un peor error de reproyección y demasiadas características no podrán ser detectadas de manera adecuada. Es por ello que se recomienda seguir las pautas establecidas en los apartados 5.4.1 y 5.4.2. También se proponen algunas líneas de trabajo para mejoras futuras. La primera y más obvia sería la de tratar de calibrar el sistema real. Esto no ha sido posible debido al cierre de los laboratorios por la situación de estado de alarma. Aprovechándonos de las conclusiones que hemos obtenido mediante las simulaciones, no debería ser muy difícil. Lo más complicado será la fabricación del patrón de calibración. La segunda sería seguir investigando el tercer algoritmo propuesto, el que utiliza un puntero láser, y tratar de conseguir una calibración buena. Se trata de un algoritmo muy interesante y sería una pena no poder aprovecharnos de su sencillez. En el apartado 5.3 se establecen los posibles causantes de errores que hacen que el algoritmo no funcione y se proponen algunas soluciones. El siguiente paso sería el de implementar el algoritmo encargado de determinar las coordenadas tridimensionales de una baliza utilizando solamente las imágenes tomadas por las cámaras. Otra posible mejora sería la de incrementar el volumen de trabajo, extendiéndolo a una mayor parte del laboratorio. Esto en principio no sería necesario para realizar las primeras pruebas, pero resultaría interesante si se quiere utilizar el sistema multicámara para un proyecto real. Probablemente requeriría de un aumento del número o la resolución de las cámaras, y de una nueva disposición. E 65 65 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos ANEXO A: SCRIPT PRINCIPAL close all Anexo A: Script principal 66 clear %%%%%%%%%%%%%%%%%%%%%%%%%% % Parametros intrinsecos % %%%%%%%%%%%%%%%%%%%%%%%%%% f = 0.0045; % Distancia focal en metros M = 1025; % Numero de pixeles verticales N = 1281; % Numero de pixeles horizontales w = 0.0061440; % Ancho del sensor en metros h = 0.0049152; % Alto del sensor en metros u0 = N/2; % Punto central de la imagen v0 = M/2; s = 0; % skew num_fotos = 50; % Numero de fotos a generar fx = f*N/w; % Longitud focal efectiva horizontal fy = f*M/h; % Longitud focal efectiva vertical A = [fx, s*fx, u0; 0, fy, v0; 0 0 1]; % Matriz de parametros intrinsecos %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Coeficientes de distorsion % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kr1 = 0.1; kr2 = 0.01; kr3 = 0.001; kr4 = 0.0001; %%%%%%%%%%%%%%%%%%%%%%%%%%% % Define camera positions % %%%%%%%%%%%%%%%%%%%%%%%%%%% % % Depende de la version del toolbox, rotx puede funcionar con % % grados o con radianes, comprobar wRc1 = rotx(-45) * roty(180);% Camara 1, matriz de rotacion wRc1(4,:) = 0; wtc1 = [0; 2.1213; 3; 1];% Camara 1, vector de traslacion wTc1 = [wRc1, wtc1];% Camara 1, matriz de transformacion completa c1Tw = inv(wTc1); wRc2 = rotx(45) * roty(180);% Camara 2, matriz de rotacion wRc2(4,:) = 0; wtc2 = [0; -2.1213; 3; 1];;% Camara 2, vector de traslacion wTc2 = [wRc2, wtc2];% Camara 2, matriz de transformacion completa c2Tw = inv(wTc2); wRc3 = roty(45) * rotx(180);% Camara 3, matriz de rotacion wRc3(4,:) = 0; wtc3 = [2.1213; 0; 3; 1];;% Camara 3, vector de traslacion wTc3 = [wRc3, wtc3];% Camara 3, matriz de transformacion completa c3Tw = inv(wTc3); wRc4 = roty(-45) * rotx(180);% Camara 4, matriz de rotacion wRc4(4,:) = 0; wtc4 = [-2.1213; 0; 3; 1];;% Camara 4, vector de traslacion 67 67 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos wTc4 = [wRc4, wtc4];% Camara 4, matriz de transformacion completa c4Tw = inv(wTc4); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Definir el tamaño del patron de calibracion % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % El patron aleatorio es de 1754x1240 pixeles % Mantenemos la resolución para no deformarlo p_sX = 1.55; % Ancho del patron en metros p_sY = 2.192; % Ancho del patron en metros % % Patron tablero de ajedrez % p_sX = 1.5 * 0.795; % p_sY = 1.5 * 1.022; % % Imagen tablero % patron = imread('G:\OneDrive\Uni\TFG\Bouguet_toolbox\calibration_pattern/patt ern.jpg'); % xmin = 17; ymin = 26; % xmax = 1257; ymax = 1621; % % % Imagen patrón 877x620 % patron = imread('G:\OneDrive - UNIVERSIDAD DE SEVILLA\TFG_Memo\Calibraciones\BoLi - Res. patron\877x620/877x620.png'); % xmin = 0; ymin = 0; % [ymax, xmax] = size(patron); % % % Imagen patrón 1315x930 % patron = imread('G:\OneDrive - UNIVERSIDAD DE SEVILLA\TFG_Memo\Calibraciones\BoLi - Res. patron\1315x930/1315x930.png'); % xmin = 0; ymin = 0; % [ymax, xmax] = size(patron); % % % Imagen patrón 1578x1116 % patron = imread('G:\OneDrive - UNIVERSIDAD DE SEVILLA\TFG_Memo\Calibraciones\BoLi - Res. patron\1578x1116/1578x1116.png'); % xmin = 0; ymin = 0; % [ymax, xmax] = size(patron); % % % Imagen patrón 1754x1240 % patron = imread('G:\OneDrive - UNIVERSIDAD DE SEVILLA\TFG_Memo\Calibraciones\BoLi - Res. patron\1754x1240/1754x1240.png'); % xmin = 0; ymin = 0; % [ymax, xmax] = size(patron); % % % Imagen patrón 1929x1364 % patron = imread('G:\OneDrive - UNIVERSIDAD DE SEVILLA\TFG_Memo\Calibraciones\BoLi - Res. patron\1929x1364/1929x1364.png'); % xmin = 0; ymin = 0; % [ymax, xmax] = size(patron); % Anexo B: Script “Plotear” 74 V_C2 = wTc2*V'; patch('Faces',F,'Vertices',V_C2(1:3,:)', 'EdgeColor', 'red', 'FaceColor', 'red', 'FaceAlpha', 0.2) % line([O_C2(1) X_C2(1)], [O_C2(2) X_C2(2)], [O_C2(3) X_C2(3)], 'Color', 'g', 'LineWidth', 2) % line([O_C2(1) Y_C2(1)], [O_C2(2) Y_C2(2)], [O_C2(3) Y_C2(3)], 'Color', 'b', 'LineWidth', 2) % line([O_C2(1) Z_C2(1)], [O_C2(2) Z_C2(2)], [O_C2(3) Z_C2(3)], 'Color', 'r', 'LineWidth', 2) text(O_C2(1), O_C2(2), O_C2(3), 'C2'); % Camara 3 O_C3 = wTc3*O; % X_C3 = wTc3*X; % Y_C3 = wTc3*Y; % Z_C3 = wTc3*Z; V_C3 = wTc3*V'; patch('Faces',F,'Vertices',V_C3(1:3,:)', 'EdgeColor', 'red', 'FaceColor', 'red', 'FaceAlpha', 0.2) % line([O_C3(1) X_C3(1)], [O_C3(2) X_C3(2)], [O_C3(3) X_C3(3)], 'Color', 'g', 'LineWidth', 2) % line([O_C3(1) Y_C3(1)], [O_C3(2) Y_C3(2)], [O_C3(3) Y_C3(3)], 'Color', 'b', 'LineWidth', 2) % line([O_C3(1) Z_C3(1)], [O_C3(2) Z_C3(2)], [O_C3(3) Z_C3(3)], 'Color', 'r', 'LineWidth', 2) text(O_C3(1), O_C3(2), O_C3(3), 'C3'); % Camera 4 axis O_C4 = wTc4*O; % X_C4 = wTc4*X; % Y_C4 = wTc4*Y; % Z_C4 = wTc4*Z; V_C4 = wTc4*V'; patch('Faces',F,'Vertices',V_C4(1:3,:)', 'EdgeColor', 'red', 'FaceColor', 'red', 'FaceAlpha', 0.2) % line([O_C4(1) X_C4(1)], [O_C4(2) X_C4(2)], [O_C4(3) X_C4(3)], 'Color', 'g', 'LineWidth', 2) % line([O_C4(1) Y_C4(1)], [O_C4(2) Y_C4(2)], [O_C4(3) Y_C4(3)], 'Color', 'b', 'LineWidth', 2) % line([O_C4(1) Z_C4(1)], [O_C4(2) Z_C4(2)], [O_C4(3) Z_C4(3)], 'Color', 'r', 'LineWidth', 2) text(O_C4(1), O_C4(2), O_C4(3), 'C4'); % Estructura metalica line([0 0], [2.1213 2.1213], [0 3], 'Color', 'k', 'LineWidth', 2) line([0 0], [-2.1213 -2.1213], [0 3], 'Color', 'k', 'LineWidth', 2) line([2.1213 2.1213], [0 0], [0 3], 'Color', 'k', 'LineWidth', 2) line([-2.1213 -2.1213], [0 0], [0 3], 'Color', 'k', 'LineWidth', 2) line([0 2.1213], [2.1213 0], [3 3], 'Color', 'k', 'LineWidth', 2) line([0 2.1213], [-2.1213 0], [3 3], 'Color', 'k', 'LineWidth', 2) line([0 -2.1213], [2.1213 0], [3 3], 'Color', 'k', 'LineWidth', 2) line([0 -2.1213], [-2.1213 0], [3 3], 'Color', 'k', 'LineWidth', 2) line([0 2.1213], [2.1213 0], [0 0], 'Color', 'k', 'LineWidth', 2) line([0 2.1213], [-2.1213 0], [0 0], 'Color', 'k', 'LineWidth', 2) line([0 -2.1213], [2.1213 0], [0 0], 'Color', 'k', 'LineWidth', 2) line([0 -2.1213], [-2.1213 0], [0 0], 'Color', 'k', 'LineWidth', 2) 75 75 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos hold off; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Proyeccion de las esquinas del patron % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% figure(2); subplot(2,2,1); plot(pix1(1,:), pix1(2,:), 'b*'); patch(pix1(1,:), pix1(2,:), 'ko-', 'FaceAlpha', 0.75); rectangle('Position', [0 0 N M]); grid(); set(gca, 'YDir', 'reverse'); axis([0-100, N+100, 0-100, M+100]); title('C1'); subplot(2,2,2); plot(pix2(1,:), pix2(2,:), 'b*'); patch(pix2(1,:), pix2(2,:), 'ko-', 'FaceAlpha', 0.75); rectangle('Position', [0 0 N M]); grid(); set(gca, 'YDir', 'reverse'); axis([0-100, N+100, 0-100, M+100]); title('C2'); subplot(2,2,3); plot(pix3(1,:), pix3(2,:), 'b*'); patch(pix3(1,:), pix3(2,:), 'ko-', 'FaceAlpha', 0.75); rectangle('Position', [0 0 N M]); grid(); set(gca, 'YDir', 'reverse'); axis([0-100, N+100, 0-100, M+100]); title('C3'); subplot(2,2,4); plot(pix4(1,:), pix4(2,:), 'b*'); patch(pix4(1,:), pix4(2,:), 'ko-', 'FaceAlpha', 0.75); rectangle('Position', [0 0 N M]); grid(); set(gca, 'YDir', 'reverse'); axis([0-100, N+100, 0-100, M+100]); title('C4'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Imagenes simuladas sin fondo % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% figure(3); subplot(2,2,1); imshow(img1_dist,[]); title('C1'); subplot(2,2,2); imshow(img2_dist,[]); title('C2'); Anexo C: Script “Sustituir fondo 76 subplot(2,2,3); imshow(img3_dist,[]); title('C3'); subplot(2,2,4); imshow(img4_dist,[]); title('C4'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Imagenes simuladas con fondo % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% figure(4); subplot(2,2,1); imshow(img1_ruido,[]); title('C1'); subplot(2,2,2); imshow(img2_ruido,[]); title('C2'); subplot(2,2,3); imshow(img3_ruido,[]); title('C3'); subplot(2,2,4); imshow(img4_ruido,[]); title('C4'); ANEXO C: SCRIPT “SUSTITUIR FONDO % Recorremos fila por fila for j = 1:size(img1_final,1) % Vamos a buscar el primer pixel que no sea negro yendo de 77 77 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos izquierda a % derecha y luego de derecha a izquierda. Una vez tengamos esos límites % sustituiremos todo lo que quede fuera por los píxeles de la imagen de % fondo. lim_izq1 = size(img1_final,2); lim_der1 = 1; lim_izq2 = size(img1_final,2); lim_der2 = 1; lim_izq3 = size(img1_final,2); lim_der3 = 1; lim_izq4 = size(img1_final,2); lim_der4 = 1; % Imagen 1, buscamos el límite izquierdo for i = 1:size(img1_final,2) if(img1_final(j,i) ~= 0 && img1_final(j,i) ~= 127) lim_izq1 = i; break; end end img1_final(j,1:lim_izq1) = fondo1(j,1:lim_izq1); % Imagen 2, buscamos el límite izquierdo for i = 1:size(img2_final,2) if(img2_final(j,i) ~= 0 && img2_final(j,i) ~= 127) lim_izq2 = i; break; end end img2_final(j,1:lim_izq2) = fondo2(j,1:lim_izq2); % Imagen 3, buscamos el límite izquierdo for i = 1:size(img3_final,2) if(img3_final(j,i) ~= 0 && img3_final(j,i) ~= 127) lim_izq3 = i; break; end end img3_final(j,1:lim_izq3) = fondo3(j,1:lim_izq3); % Imagen 4, buscamos el límite izquierdo for i = 1:size(img4_final,2) if(img4_final(j,i) ~= 0 && img4_final(j,i) ~= 127) lim_izq4 = i; break; end end img4_final(j,1:lim_izq4) = fondo4(j,1:lim_izq4); % Imagen 1, buscamos el límite derecho for i = size(img1_final,2):-1:1 if(img1_final(j,i) ~= 0 && img1_final(j,i) ~= 127) lim_der1 = i; break; end Anexo C: Script “Sustituir fondo 78 end img1_final(j,lim_der1:size(img1_final,2)) = fondo1(j,lim_der1:size(img1_final,2)); % Imagen 2, buscamos el límite derecho for i = size(img2_final,2):-1:1 if(img2_final(j,i) ~= 0 && img2_final(j,i) ~= 127) lim_der2 = i; break; end end img2_final(j,lim_der2:size(img2_final,2)) = fondo2(j,lim_der2:size(img2_final,2)); % Imagen 3, buscamos el límite derecho for i = size(img3_final,2):-1:1 if(img3_final(j,i) ~= 0 && img3_final(j,i) ~= 127) lim_der3 = i; break; end end img3_final(j,lim_der3:size(img3_final,2)) = fondo3(j,lim_der3:size(img3_final,2)); % Imagen 4, buscamos el límite derecho for i = size(img4_final,2):-1:1 if(img4_final(j,i) ~= 0 && img4_final(j,i) ~= 127) lim_der4 = i; break; end end img4_final(j,lim_der4:size(img4_final,2)) = fondo4(j,lim_der4:size(img4_final,2)); end 79 79 Experiencias en calibración de sistema multicámara para seguimiento tridimensional de objetos 11 REFERENCIAS 1. Marvelmind Robotics. [En línea] https://marvelmind.com/. 2. Alhacén. [En línea] https://es.wikipedia.org/wiki/Alhac%C3%A9n. 3. MORVAN, Yannick. Acquisition, Compression and Rendering of Depth and Texture for Multi-View Video. [En línea] 2009. http://epixea.com/research/multi-view-coding-thesisch2.html#x13-32003r2. 4. Arahal, Manuel Ruiz. Transparencias de la asignatura Sistemas de Percepción. Universidad de Sevilla : s.n., 4º curso del Grado en Ing. Electrónica, Robótica y Mecatrónica, Curso 2019-20. 5. Zhang, Zhengyou. A Flexible New Technique for Camera Calibration. s.l. : Microsoft Research, 1998. 6. Bouguet, Jean-Yves. Camera Calibration Toolbox for Matlab. [En línea] 1999. http://www.vision.caltech.edu/bouguetj/calib_doc/. 7. A Multiple-Camera System Calibration Toolbox Using A Feature descriptor-based calibration pattern. Li, Bo, y otros. Tokyo : IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 2013. 8. A convenient multicamera self-calibration for virtual environments. SVOBODA, Tomáš, MARTINEC, Daniel y PAJDLA, Tomáš. 4, s.l. : Presence: Teleoperators & virtual environments, 2005, Vol. 14. 9. Reprojection error. [En línea] https://en.wikipedia.org/wiki/Reprojection_error.