Semana 13. Registro Afín 2D en Entornos Sintéticos
Esta semana he comenzado a investigar y a implementar técnicas de registro afín para alinear dos imágenes en una misma referencia geométrica. Este tipo de registro es especialmente relevante en la percepción para conducción autónoma, ya que permite corregir diferencias entre vistas de cámara y de sensor LiDAR. A partir de clases comunes entre ambas imágenes, se estima una transformación afín que permita la posibilidad de proyectarlas sobre un plano común.
Para abordar esta tarea he comenzado creando una imagen sintética. A partir de esta imagen se ha desarrollado un primer programa que permite extraer una subimagen mediante un recorte definido por coordenadas ((x_0, y_0, w, h)). A continuación, esta subimagen se somete a una transformación geométrica afín compuesta por un escalado, una rotación y una traslación conocidas. Los valores y las imágenes generadas son las siguientes:
Ground Truth
- Recorte original (x0, y0, w, h): (350, 280, 480, 560)
- Rotación (deg): 37.0
- Escala: 1.3
- Anchor centro (cx, cy): (620, 520)

Una vez generado este problema sintético, se ha desarrollado un segundo programa cuyo objetivo es estimar la transformación afín que relaciona la subimagen transformada (patch_warped) con la imagen original. Para ello se ha hecho uso de detección de características locales mediante el algoritmo ORB (Oriented FAST and Rotated BRIEF), seguido de un proceso de emparejamiento de descriptores mediante un BFMatcher y la estimación robusta de la transformación afín parcial utilizando RANSAC (Random sample consensus) a través de la función cv2.estimateAffinePartial2D.
Como resultado, el sistema genera dos salidas principales: por un lado, la imagen overlay, donde la subimagen proyectada mediante la transformación estimada se superpone a la imagen grande permitiendo una validación visual del alineamiento; por otro lado, la imagen matches, que muestra las correspondencias entre puntos clave detectados en ambas imágenes y que han sido utilizadas para estimar la transformación geométrica. De esta manera, al conocer la transformación real aplicada inicialmente, es posible comparar los parámetros estimados con los valores originales y evaluar cuantitativamente el desempeño del algoritmo de registro. Los parámetros estimados son bastante cercanos a los originales:
Transformación Inversa (BIG → PATCH)
- Escala: 1.3006
- Ángulo: -36.98°
- Traslación (Tx, Ty): (-582.05, 357.57)

Los resultados obtenidos muestran una alta coherencia entre la transformación aplicada inicialmente (ground truth) y la transformación estimada por el algoritmo. En particular, la rotación aplicada de 37° y la escala de 1.3 se recuperan con gran precisión en la matriz inversa estimada, obteniéndose una escala de 1.3006 y un ángulo de −36.98°, lo que confirma que el sistema está calculando correctamente la transformación. La aparente discrepancia en los parámetros de la transformación directa se debe a que el algoritmo está estimando la relación en el sentido inverso al utilizado en la generación sintética, es decir, está deshaciendo la transformación aplicada originalmente. Este comportamiento es matemáticamente consistente, ya que la inversa de una transformación afín mantiene la misma magnitud de escala y rotación (con cambio de signo en el ángulo) ajustando la traslación en función del nuevo sistema de referencia.
Después, se ha construido un pipeline completo para pasar de una nube de puntos LiDAR segmentada a una imagen 2D comparable con la segmentación de cámara. Primero, usamos el modelo rellis_20-minkunet para obtener las etiquetas semánticas por punto y generamos colors.bin. Como el modelo trabaja con ~20 clases y nuestra segmentación semántica visual usa solo 8, introdujimos un label_map.json para remapear las etiquetas LiDAR (0..19) a una ontología común (0..7). Después, aplicamos esa ontología común (ontology.json) para asegurar que ambas modalidades usaran los mismos colores por clase. Finalmente, proyectamos la nube 3D al plano imagen usando el modelo pinhole, definiendo intrínsecos (fx, fy, cx, cy a partir del FOV) y extrínsecos (cambio de ejes LiDAR→cámara + rotación yaw), filtrando puntos con (Z>0) y aplicando un z-buffer para generar lidar_projected.png. Con esto, obtenemos una imagen semántica LiDAR alineable con la segmentación visual mediante registro 2D–2D.