Qué es la calibración de cámara - Procedimiento práctico para estimar los parámetros intrínsecos y corregir la distorsión
Qué es la calibración de cámara - Por qué es necesaria
La calibración de cámara (Camera Calibration) es el proceso de estimar los parámetros que describen matemáticamente las características ópticas / geométricas de una cámara. Es indispensable para predecir con exactitud en qué posición de la imagen 2D se proyecta un punto del espacio 3D, y es la base de casi todas las tareas de visión por computadora.
Situaciones en las que se necesita la calibración:
- Medición 3D: medir distancias exactas con visión estéreo o Structure from Motion
- AR (realidad aumentada): colocar con exactitud objetos virtuales en el mundo real
- Conducción autónoma: estimar la distancia a los obstáculos a partir de las imágenes de la cámara
- Visión robótica: hacer corresponder el sistema de coordenadas del brazo robótico con el sistema de coordenadas de la cámara
- Corrección de la distorsión: eliminar la distorsión de barril de los objetivos gran angular para obtener una imagen exacta
Clasificación de los parámetros de la cámara:
- Parámetros intrínsecos (Intrinsic): distancia focal, punto principal y coeficientes de distorsión. Son las características ópticas propias de la cámara
- Parámetros extrínsecos (Extrinsic): matriz de rotación y vector de traslación. Son la posición y la orientación de la cámara
Los parámetros intrínsecos son constantes mientras no cambie la combinación de cámara y objetivo, pero en el caso de un objetivo zoom hace falta calibrar para cada distancia focal. Los parámetros extrínsecos cambian cada vez que la cámara se mueve. En una calibración habitual, se fotografía un patrón conocido (un tablero de ajedrez, etc.) desde varios ángulos y se estiman a la vez todos los parámetros a partir de los puntos correspondientes.
El modelo de cámara estenopeica - Descripción matemática de la proyección
El modelo de cámara estenopeica ignora el grosor del objetivo y describe matemáticamente una cámara ideal en la que la luz pasa por 1 punto (el estenopo) y se proyecta en el plano de imagen. Se usa ampliamente como modelo aproximado de las cámaras reales.
Ecuación de proyección: la relación por la que un punto (X, Y, Z) del espacio 3D se proyecta en el punto (u, v) de la imagen se expresa con la siguiente ecuación matricial.
s[u, v, 1]^T = K[R|t][X, Y, Z, 1]^T
Aquí, K es la matriz de parámetros intrínsecos (matriz de la cámara), [R|t] son los parámetros extrínsecos (matriz de 3x4) y s es el factor de escala.
Matriz de parámetros intrínsecos K:
K = [[fx, 0, cx], [0, fy, cy], [0, 0, 1]]
- fx, fy: distancia focal en píxeles. fx = f × sx (f: distancia focal física en mm, sx: densidad de píxeles en la dirección x en pixel/mm)
- cx, cy: coordenadas en píxeles del punto principal (la intersección del eje óptico con el plano de imagen). Idealmente es el centro de la imagen, pero en la práctica se desvía unos píxeles
Ejemplos de parámetros intrínsecos de cámaras comunes: iPhone 14 Pro (cámara principal): fx ≈ 3.000 px, cx ≈ 2.016 px, cy ≈ 1.512 px (resolución de 4.032 × 3.024). GoPro Hero 11: fx ≈ 1.500 px (la distancia focal es corta por ser gran angular). Cámara industrial (5MP, objetivo de 8mm): fx ≈ 2.800 px.
Cuanto mayor es la distancia focal, más teleobjetivo (ángulo de visión estrecho), y cuanto menor, más gran angular (ángulo de visión amplio). Si la desviación del punto principal es grande, es posible que haya un problema en la precisión del montaje del objetivo.
Modelos de distorsión de lentes - Distorsión radial y distorsión tangencial
Los objetivos reales se apartan del modelo estenopeico ideal (distorsión). Modelar y corregir la distorsión con exactitud mejora mucho la precisión de la medición. En OpenCV se usan de forma estándar 5 coeficientes de distorsión (k1, k2, p1, p2, k3).
Distorsión radial (Radial Distortion): es la distorsión que se produce según la distancia al centro del objetivo. Cuanto más se aleja del eje óptico, mayor es la distorsión.
- Distorsión de barril (Barrel): k1 < 0. La periferia de la imagen se abomba hacia afuera. Es notable en los objetivos gran angular
- Distorsión de cojín (Pincushion): k1 > 0. La periferia de la imagen se hunde hacia adentro. Se produce en los teleobjetivos
Sin distorsión
Barril (k1 < 0)
Cojín (k1 > 0)
x_distorted = x(1 + k1*r² + k2*r⁴ + k3*r⁶)
y_distorted = y(1 + k1*r² + k2*r⁴ + k3*r⁶)
Aquí, r² = x² + y² (la distancia al centro en coordenadas normalizadas). Valores habituales: objetivo gran angular k1 ≈ -0,3, objetivo estándar k1 ≈ -0,05, teleobjetivo k1 ≈ 0,01.
Distorsión tangencial (Tangential Distortion): es la distorsión que se produce cuando el objetivo y el sensor no son perfectamente paralelos. Depende de la precisión de fabricación y normalmente tiene un valor menor que la distorsión radial.
x_distorted = x + 2*p1*x*y + p2*(r² + 2*x²)
y_distorted = y + p1*(r² + 2*y²) + 2*p2*x*y
Valores habituales: p1, p2 ≈ ±0,001. En los objetivos de alta calidad es un nivel despreciable, pero en los objetivos baratos y las cámaras web hace falta corregirla. En objetivos ultra gran angular como los de GoPro, pueden ser necesarios coeficientes de distorsión de orden aún más alto (k4, k5, k6) o un modelo de prisma delgado.
Procedimiento de calibración con el método de Zhang
El método de Zhang (2000) es una técnica práctica que permite estimar todos los parámetros de la cámara con solo fotografiar un patrón plano (un tablero de ajedrez) desde varios ángulos. No requiere equipos especiales y está implementado por completo en OpenCV, por lo que es la técnica de calibración más usada.
Material necesario:
- Un patrón de tablero de ajedrez (recomendado: 9x6 o 10x7 esquinas interiores)
- La planitud del patrón es importante. Pégalo sobre cartón o una placa acrílica
- Mide con exactitud el tamaño de las casillas (ejemplo: 25mm)
Pautas para la toma de imágenes:
- Toma como mínimo 10 imágenes, y se recomiendan 20-30
- Inclina el patrón en ángulos variados (unos ±45°)
- Cambia la posición al fotografiar para que el patrón se distribuya por toda la imagen
- Haz que el patrón llegue también a los bordes de la imagen (es importante para estimar la distorsión)
- Usa imágenes nítidas y bien enfocadas
Procedimiento de implementación en OpenCV:
- Detecta las esquinas con
cv2.findChessboardCorners() - Afínalas a precisión de subpíxel con
cv2.cornerSubPix() - Construye la correspondencia entre los puntos 3D (coordenadas conocidas en el tablero) y los puntos 2D (las esquinas detectadas)
- Estima a la vez todos los parámetros con
cv2.calibrateCamera()
Evaluación del error de reproyección: la calidad del resultado de la calibración se evalúa con el error de reproyección (Reprojection Error). Se reproyectan los puntos 3D en la imagen con los parámetros estimados y se calcula la distancia a los puntos detectados. En una buena calibración es de 0,1-0,5 píxeles, y el rango tolerable es de 1,0 píxeles o menos. Si supera 1,0, hay que revisar las condiciones de la toma y la detección del patrón.
Implementación y aplicaciones de la corrección de distorsión
Explicamos el proceso para eliminar la distorsión de las imágenes tomadas usando los coeficientes de distorsión obtenidos en la calibración. La corrección de la distorsión es imprescindible como preprocesamiento de la medición 3D, y una corrección exacta determina la precisión de los procesos posteriores.
Corrección de la distorsión en OpenCV:
- Método 1:
cv2.undistort(img, K, dist_coeffs)- El más sencillo. Como recalcula en cada fotograma, es ineficiente para procesar video - Método 2:
cv2.initUndistortRectifyMap()+cv2.remap()- Precalcula el mapa y lo reutiliza. Es ideal para procesar video. El mapa se calcula una sola vez, y remap es rápido (unos 3ms en 1080p)
Tamaño de la imagen tras la corrección: como la corrección de la distorsión recorta los bordes de la imagen, se calcula una nueva matriz de cámara con cv2.getOptimalNewCameraMatrix(). Con alpha=0 se eliminan por completo las zonas negras (la imagen se hace más pequeña), y con alpha=1 se conservan todos los píxeles (quedan zonas negras). Ajusta alpha entre 0-1 según el uso.
Corrección de objetivos ojo de pez: el modelo de distorsión normal no sirve para los objetivos ojo de pez con un ángulo de visión de 180° o más. El módulo cv2.fisheye de OpenCV usa un modelo de proyección equidistante y permite calibrar y corregir objetivos ultra gran angular. Se usan cv2.fisheye.calibrate() y cv2.fisheye.undistortImage().
Guardado del resultado de la calibración: guarda los parámetros estimados en formato YAML o JSON, y cárgalos en la aplicación para usarlos. Con la clase cv2.FileStorage de OpenCV puedes guardarlos / cargarlos con facilidad. Mientras no cambie la combinación de cámara y objetivo, una sola calibración sirve durante mucho tiempo.
Técnicas de calibración de alta precisión y resolución de problemas
Explicamos técnicas para lograr la calibración de alta precisión (error de reproyección de 0,1 píxeles o menos) que exigen los usos industriales y de investigación, y soluciones a los problemas frecuentes.
Técnicas para aumentar la precisión:
- Calidad del patrón: un patrón impreso con impresora láser puede tener distorsiones. Si necesitas alta precisión, usa un patrón grabado sobre un sustrato de vidrio
- Condiciones de iluminación: fotografía con una iluminación difusa uniforme. La luz directa y las sombras reducen la precisión de la detección de esquinas
- Número de imágenes: usar 50 o más imágenes da una estimación estadísticamente estable
- Colocación del patrón: haz que el patrón llegue también a las cuatro esquinas de la imagen. Si solo está cerca del centro, baja la precisión de la estimación de los coeficientes de distorsión
- Parámetros fijos: si puedes suponer fx = fy (píxeles cuadrados), añade la restricción con el indicador
cv2.CALIB_FIX_ASPECT_RATIO
Resolución de problemas:
- El error de reproyección es grande (> 1,0px): se debe a imágenes movidas, a un patrón que no es plano o a errores en la detección de esquinas. Revisa las imágenes una a una y excluye las que tengan un error grande
- La distancia focal tiene un valor anómalo: el patrón es demasiado pequeño respecto a la imagen, o la variación de ángulos es insuficiente. Haz que el patrón ocupe el 20% o más de la superficie de la imagen
- Los coeficientes de distorsión son inestables: faltan imágenes, o el patrón se concentra en el centro de la imagen. Coloca el patrón también en los bordes de la imagen
Calibración automática: en los sistemas SLAM (Simultaneous Localization and Mapping) se usa la autocalibración, que estima automáticamente los parámetros de la cámara a partir del seguimiento de puntos característicos. ORB-SLAM3 y COLMAP tienen funciones para estimar los parámetros intrínsecos a partir de los puntos característicos naturales de la escena. Su precisión es inferior a la de los métodos basados en patrones, pero tienen la ventaja de que se pueden usar sin preparación previa.