Progreso marzo 2024 - RoboticsURJC/tfg-dcampoamor GitHub Wiki
SEMANA 41 (26/02/2024-03/03/2024)
SEMANA 42 (18/03/2024-24/03/2024)
SEMANA 43 (25/03/2024-31/03/2024)
- Pruebas con programas para calcular las coordenadas del mundo real a partir de coordenadas de imagen utilizando una única cámara calibrada basada en geometría analítica
- Lectura sobre geometría analítica y la transformación de coordenadas
SEMANA 41 (26/02/2024-03/03/2024)
-
Modificación de la función para convertir píxeles a unidades ópticas
Debido a que el programa no contemplaba casos específicos como cuando ese punto se encuentre en los bordes laterales derechos de la matriz de píxeles, se intentó poder obtener un caso general que incluyese estos supuestos, obteniendo de manera gráfica lo siguiente:
En este caso, cuando el punto original (punto en coordenadas de píxeles) está en el borde lateral derecho de la matriz, el punto en coordenadas de píxeles se trasladará al mismo punto en la matriz de coordenadas ópticas, de manera visual, por lo que únicamente se aprecia un punto. Esto se debe a que el punto original ya se encuentra en la posición más alejada del origen en la dirección horizontal, por lo que al aplicar la traslación, el punto trasladado coincidirá con el original en la matriz trasladada de manera gráfica.
Es decir, cuando el punto en coordenadas de píxeles está en el borde lateral derecho de la matriz, la traslación no tiene ningún efecto sobre su posición en la matriz trasladada de coordenadas ópticas de manera visual. El punto trasladado seguirá estando en la misma posición que el punto original.
Esto mismo ocurre cuando el punto original se encuentra a lo largo de la última columna de la matriz, en el punto superior derecho, a lo largo de la última fila (en la parte inferior de la matriz), en cualquiera de las esquinas inferiores (inferior izquierda o inferior derecha), o simplemente en cualquier punto de la matriz de píxeles que al trasladarlo a coordenadas ópticas quedase físicamente fuera de la matriz, siendo el punto trasladado coincidente con el original en la matriz trasladada de manera visual.
Todo esto no implica que si el punto original está siendo percibido por la cámara y queremos obtener sus coordenadas ópticas utilizando la traslación, el punto trasladado también estaría dentro del campo de visión de la cámara. En este caso, la traslación solo afecta las coordenadas del punto en el espacio, pero no lo sacaría del campo de visión de la cámara.
Cuando aplicamos la traslación a un punto dentro de la matriz de píxeles, las coordenadas resultantes estarán en el sistema de coordenadas trasladado, pero aún estarán dentro del campo de visión de la cámara. La traslación no hace que el punto trasladado quede fuera del campo de visión, siempre y cuando el punto original esté dentro de la matriz de píxeles que la cámara está capturando.
Con todo esto, se modificó la función pixel2optical del programa pos_centroide.py:
Función para convertir de píxeles a unidades ópticas def pixel2optical(pixel_x, pixel_y, resolution=(640, 480)): Desplazar el origen al centro del recuadro de 640x480 centered_x = resolution[0] // 2 centered_y = resolution[1] // 2 Convertir píxeles a unidades ópticas optic_x = pixel_x - centered_x optic_y = centered_y - pixel_y # Invertir el eje y para que aumente hacia arriba return optic_x, optic_y
Tras este cambio, se volvió a ejecutar el programa, viendo que las coordenadas ópticas en relación a los píxeles guardaban mejor la relación, y podían tener mayor sentido que los resultados obtenidos anteriormente, mientras que las coordenadas en 3D, es decir, en sistema cartesiano, seguían sin guardar relación ninguna con las medidas reales.
SEMANA 42 (18/03/2024-24/03/2024)
-
Pruebas con programas para calcular las coordenadas del mundo real a partir de coordenadas de imagen utilizando una única cámara calibrada basada en geometría analítica
Debido a las dificultades encontradas a la hora de elaborar un programa genérico capaz de convertir los puntos obtenidos en píxeles por la cámara web en tiempo real para poder pasarlos a coordenadas homogéneas, habiendo calculado la coordenada del centro de proyección en el sistema de coordenadas del mundo real para poder utilizarlo en el cálculo de la coordenada del punto (coordenadas x,y,z) en el sistema de coordenadas del mundo real mediante el uso de ecuaciones matemáticas y la hipótesis suelo (Z=0), se utilizó el repositorio Camera-Calibration-and-Backprojection como guía para poder obtener esta conversión de coordenadas.
Este repositorio en lugar de obtener los puntos de los cuales habrá que calcular sus coordenadas en el mundo real, directamente de la cámara en vivo, los calcula a partir de imágenes obtenidas previamente por esta. Sin embargo, se trata de un repositorio desactualizado, por lo que los programa de los que consta dicho repositorio, y que se detallan a continuación se encontrarán en la rama M-CAIT-2013 de Camera-Calibration-and-Backprojection, que es la rama con la versión más precisa y reciente de los algoritmos y la documentación:
Script Descripción captureImages.py Este script captura imágenes de la cámara y las guarda en el directorio especificado. calibrateCamera.py Este script calibra la cámara y guarda los parámetros de calibración en el archivo yaml especificado. 2Dto3D.py Este script verifica los parámetros obtenidos mediante la calibración de la cámara. get3Dpoint.py Este script retroproyecta las coordenadas de la imagen al sistema de coordenadas del mundo real mediante el método especificado en el documento. Es debido a esta desactualización, que a la hora de clonar el repositorio de manera local para poder testearlo, no es posible clonar exactamente estos scripts, por lo que se realizaron las pruebas con los scripts de la rama main.
Debido a que ya se tenía calibrada la cámara, obteniendo la matriz de parámetros intrínsecos gracias al script PiCamCalibration.py, llevamos a cabo de nuevo la calibración de esta con el programa del repositorio calibrateCamera.py para comparar resultados. Para que este programa pudiera funcionar, se tuvieron que adaptar algunos parámetros como el tamaño del patrón y los cuadrados del chess board.
Tras la calibración de la cámara se obtuvieron los siguientes resultados:
Siendo similares a la media obtenida de las mediciones que se realizaron anteriormente con PiCamCalibration.py.
Una vez comprobado el archivo de calibración de la cámara del repositorio, nos fijaremos en el script get3Dpoint.py, que encontraremos con el nombre getRealCoords.py en la rama main del repositorio.
En get3Dpoint.py se pueden diferenciar varios pasos. En el primero, se obtienen estos valores intrínsecos (matriz K) de la cámara de la calibración llevada a cabo, al igual que los extrínsecos (matrices R y T) de un archivo .yaml que guarda estos datos y otros de la cámara utilizada.
Para las pruebas con estos scripts, previas a la adaptación al uso final que queremos que tenga, dado que se ha probado el calibrador que incluía también el repositorio, los datos obtenidos mostrados anteriormente se han almacenado también en el archivo LogitechC310_static_camera.yaml, permitiendo utilizar los valores de la cámara que se está usando.
Esto es debido al fragmento en el código del script calibrateCamera.py siguiente:
Con todo esto, al utilizar una serie de puntos de prueba que mediante el script implantamos de manera directa, y fijando la coordenada Z a 50 cm (distancia a la que suponemos que se encuentra la cámara del suelo), obtenemos los siguientes resultados:
SEMANA 43 (25/03/2024-31/03/2024)
-
Pruebas con programas para calcular las coordenadas del mundo real a partir de coordenadas de imagen utilizando una única cámara calibrada basada en geometría analítica
Para la rama M-CAIT-2013 del repositorio, cuyos archivos pueden encontrarse en M-CAIT-2013, se repitió el proceso llevado a cabo con la rama main, por lo que se volvió a realizar la calibración de la cámara web externa obteniendo los siguientes resultados:
Al comparar estos resultados con los obtenidos con el programa disponible en la rama main, se puede observar que para las mismas imágenes del chess board facilitadas, se obtienen exactamente los mismos resultados de la matriz intrínseca de la cámara (matriz K) y coeficientes de distorsión, que a su vez, como se mencionó anteriormente, son también similares a la media realizada a la hora de efectuar varias calibraciones con diferentes grupos de imágenes obtenidas con el script captura_foto.py que después de utilizaron para la calibración de la cámara en PiCamCalibration.py.
De igual manera, con este script de calibración, los datos obtenidos mostrados anteriormente se han almacenaron en el archivo LogitechC310_static_camera.yaml, permitiendo utilizar los valores de la cámara que se está usando y se ha calibrado.
Para el testeo de los scripts de esta rama, se utilizaron los mismos puntos ficticios para el cálculo de sus coordenadas mundo real, y de este modo poder comprar ambos resultados después de ejecutar el script get3Dpoint.py.
Una vez ejecutado el script, obtenemos la siguiente comparación con los resultados obtenidos de ejecutar el script getRealCoords.py.
Tras obtener estos resultados, se revisaron ambos scripts, ya que a pesar de tener objetivos similares, el de transformar puntos de una imagen 2D a coordenadas 3D en un sistema de coordenadas del mundo real utilizando la información de calibración de una cámara, existen algunas diferencias clave en los cálculos y enfoques que hayan podido llevar a estos resultados diferentes.
-
Lectura sobre geometría analítica y la transformación de coordenadas
Se realizó la lectura del paper Real World Coordinate from Image Coordinate Using Single Calibrated Camera Based on Analytic Geometry en el cual se basaba el repositorio.