Contents — find the section you need
El SLAM visual, la odometría visual, la geometría epipolar y el PnP dan por sentado un mapeo correcto de las coordenadas de píxeles al espacio 3D. Sin embargo, la luz que atraviesa una lente nunca forma una imagen como lo haría un orificio estenopeico ideal. ¿Cuál es la distancia focal en píxeles? ¿A qué distancia se encuentra el punto principal del centro de la imagen? ¿Cuánto se curva una línea recta en la imagen? La calibración de la cámara consiste en calcular numéricamente estas cantidades. Si se descuida la calibración, por muy sofisticado que sea el algoritmo SLAM o SfM aplicado, se propagará un error sistemático desde la base.
0. Resumen de 30 segundos
-
La calibración de la cámara es el proceso de estimar los parámetros intrínsecos (distancia focal, punto principal, sesgo) y los coeficientes de distorsión a partir de correspondencias conocidas entre puntos 3D y puntos de la imagen. Los parámetros extrínsecos (la posición de la cámara en cada toma) se recuperan simultáneamente.
-
Los objetivos presentan distorsión geométrica tanto radial como tangencial. La representación estándar es el modelo de Brown-Conrady, que expresa la distorsión radial como k_1,k_2,k_3 y la tangencial como p_1,p_2. Los objetivos gran angular y ojo de pez requieren un modelo diferente.
-
El método de Zhang —que consiste en fotografiar un patrón plano (como un tablero de ajedrez) desde varias posiciones, resolver linealmente los parámetros intrínsecos a partir de la homografía de cada vista y, posteriormente, refinar la corrección incluyendo la distorsión mediante optimización no lineal— es el método de calibración estándar en la práctica.
-
La calidad de la calibración se evalúa mediante el error de reproyección. No basta con observar únicamente el valor medio; también es necesario comprobar la distribución espacial del error dentro de la imagen y la varianza entre las distintas poses, o se pasarán por alto distorsiones localizadas que no se capturaron por completo.
La calibración no es una constante que se mantenga indefinidamente una vez establecida. El zoom, el enfoque, la temperatura, los golpes y los cambios en la resolución o el recorte pueden modificar los parámetros intrínsecos. Los sistemas posteriores de Visual SLAM, VO y PnP se degradan silenciosamente cuando se incumple esta premisa.
1. Revisitando el modelo estenopeico a partir de coordenadas
En el modelo estenopeico, un punto de coordenadas del mundo \mathbf{X}=(X,Y,Z,1)^\mathsf{T} (coordenadas homogéneas) se proyecta sobre la imagen, a escala, como:
R\in SO(3) y \mathbf{t} representan la rotación y la traslación de las coordenadas del mundo a las coordenadas de la cámara (los parámetros extrínsecos), y K es la matriz intrínseca.
Aquí, f_x,f_y son las distancias focales en píxeles, (c_x,c_y) es el punto principal (donde el eje óptico interseca el plano de la imagen) y s es la distorsión (casi nula en la mayoría de los sensores modernos). La calibración es el problema inverso de recuperar la K, los coeficientes de distorsión y la R,\mathbf{t} de cada disparo, a partir exclusivamente de los datos observados.
La calibración consiste en recuperar la K, los coeficientes de distorsión y la R,\mathbf{t} de cada disparo, basándose únicamente en los datos observados.
Como muestra el diagrama, una sola toma no permite separar los parámetros intrínsecos de los extrínsecos. Solo mediante la recopilación de varias observaciones en diferentes poses (inclinación, distancia) se puede determinar K de forma casi unívoca, y esta es precisamente la idea central del método de Zhang, que se explica a continuación.
2. Una lente no es un estenopeico ideal: el modelo de distorsión
Las lentes reales presentan distorsión radial y tangencial. Si escribimos las coordenadas de la imagen normalizada como (x,y)=(X_c/Z_c,\,Y_c/Z_c) y el radio como r^2=x^2+y^2, el modelo de distorsión de Brown-Conrady se puede expresar de la siguiente manera.
k_1,k_2,k_3 son los coeficientes de distorsión radial, y p_1,p_2 son los coeficientes de distorsión tangencial. La distorsión radial es un fenómeno en el que la imagen se contrae o se abomba dependiendo de la distancia al centro de la lente, manifestándose como la pronunciada distorsión de "barril" que se observa con las lentes gran angular, o la distorsión de "cojín" que se observa con las lentes telefoto. La distorsión tangencial es un componente asimétrico menor que surge de imperfecciones de implementación donde el grupo de lentes y el sensor de imagen no son perfectamente paralelos. Las coordenadas finales de píxeles se obtienen como \tilde{\mathbf{x}}_{px}=K(x_d,y_d,1)^\mathsf{T}.
Para lentes con un campo de visión extremadamente amplio, como las lentes ojo de pez, el modelo polinómico de Brown-Conrady tiende a divergir cerca de los bordes y no resulta práctico. En su lugar, es común utilizar una aproximación de proyección equidistante basada en ángulos, como el modelo ojo de pez de OpenCV. En lugar de "memorizar un único modelo de distorsión", es importante tener en cuenta que el modelo debe elegirse en función del campo de visión y el diseño óptico de la lente.
3. Método de Zhang: Calibración con un patrón plano
El método más utilizado actualmente es el método de calibración con patrón plano que Zhengyou Zhang publicó en 2000. No se necesita ningún equipo de calibración 3D especial; basta con fotografiar un patrón plano, como un tablero de ajedrez impreso, desde varias posiciones, moviendo la cámara o el propio patrón.
El mapeo desde el plano del patrón (tomando Z=0) en una pose i hasta la imagen se puede escribir como una homografía utilizando la primera y la segunda columna de la matriz de rotación \mathbf{r}_1,\mathbf{r}_2 y la traslación \mathbf{t}.
Aquí, el H_i de cada pose se puede estimar linealmente a partir de los puntos de la cuadrícula conocidos en el patrón y sus correspondencias con la imagen, utilizando el método DLT descrito en la Introducción a la Homografía. Utilizando la restricción de que las columnas de la matriz de rotación sean ortonormales — \mathbf{r}_1^\mathsf{T}\mathbf{r}_2=0,\ \|\mathbf{r}_1\|=\|\mathbf{r}_2\| — se obtiene una ecuación lineal en B=K^{-\mathsf{T}}K^{-1}:
que proporciona dos ecuaciones de este tipo por pose (\mathbf{h}_1,\mathbf{h}_2 son la primera y la segunda columna de H_i). Dado que B es una matriz simétrica con 6 grados de libertad, con 3 o más poses, B se puede calcular mediante mínimos cuadrados lineales, y luego K se puede obtener en forma cerrada mediante un procedimiento equivalente a la descomposición de Cholesky. Por eso, el método de Zhang solo necesita "unas pocas tomas de un plano". Sin embargo, si todas las poses son casi paralelas al plano de la imagen (frontoparalelas), las ecuaciones degeneran, por lo que se requieren poses con diferentes inclinaciones.
La solución analítica es solo un valor inicial que ignora la distorsión. A partir de aquí, el enfoque estándar de dos etapas en la práctica refina todos los parámetros, incluidos los coeficientes de distorsión, mediante optimización no lineal (generalmente Levenberg-Marquardt) utilizando el error de reproyección descrito en la siguiente sección como función objetivo.
4. Error de reproyección y optimización de parámetros
La función objetivo de la calibración consiste en minimizar, para cada pose y cada punto de la cuadrícula, la diferencia entre el píxel observado y la posición proyectada calculada con los parámetros estimados. Si escribimos la observación en la pose i, el punto j como \mathbf{u}_{ij}, y el punto 3D conocido correspondiente en el plano como \mathbf{X}_j,
es lo que se minimiza. \boldsymbol{\kappa}=(k_1,k_2,k_3,p_1,p_2) es el vector de coeficientes de distorsión, y \pi_d es la función de proyección que incluye la distorsión. Las incógnitas son numerosas: K (4-5 grados de libertad), \boldsymbol{\kappa} (3-5 grados de libertad) y R_i,\mathbf{t}_i por pose (6 grados de libertad × número de poses), pero con suficientes puntos observados, el problema está bien definido. Esta formulación puede considerarse un caso especial del marco de "optimización conjunta de la pose de la cámara y la estructura 3D" descrito en la Introducción al Ajuste de Haces. Dado que las coordenadas de los puntos 3D son conocidas y fijas en la calibración, se trata de un subproblema más sencillo que el ajuste de haces convencional.
Es común informar la raíz cuadrática media (RMS) del error de reproyección \left\|\mathbf{u}_{ij}-\hat{\mathbf{u}}_{ij}\right\| como "precisión de calibración", pero es arriesgado afirmar que la calibración se ha realizado simplemente observando el valor medio. Siempre verifique también lo siguiente:
- Si existe variación en el error medio de cada pose (una pose con un error particularmente grande en un ángulo específico sugiere distorsión del patrón, desenfoque por movimiento o iluminación irregular).
- La distribución espacial del error dentro de la imagen (un error sistemático que persiste en los bordes sugiere que el orden o el tipo del modelo de distorsión puede ser insuficiente).
- Precisión subpíxel de la detección de puntos de la cuadrícula (si la detección de esquinas es inestable, ninguna optimización podrá distinguirla del error del modelo).
5. Esqueleto de implementación en OpenCV
El procedimiento típico de calibración con una sola cámara es el siguiente: ajustar las condiciones de disparo (resolución, zoom, enfoque) y fotografiar el patrón en las cuatro esquinas, el centro y varias inclinaciones de la imagen representa el 90 % de una buena calibración.
import cv2 as cv
import numpy as np
pattern_size = (9, 6) # number of internal corners
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
objp *= square_size_m # measured side length of one square [m]
obj_points, img_points = [], []
for gray in calibration_images: # multiple frames shot at different poses
found, corners = cv.findChessboardCorners(gray, pattern_size)
if found:
corners = cv.cornerSubPix(gray, corners, (11, 11), (-1, -1),
(cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001))
obj_points.append(objp)
img_points.append(corners)
ret, K, dist, rvecs, tvecs = cv.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None)
# ret is the RMS reprojection error [px]. Also compute per-pose error separately to check.
Para lentes gran angular u ojo de pez, utilice la familia de API cv.fisheye.calibrate en lugar de la calibrateCamera estándar. Para un sistema estéreo, utilice cv.stereoCalibrate para determinar la pose relativa, además de los parámetros intrínsecos de ambas cámaras, y cv.stereoRectify para alinear las imágenes izquierda y derecha con las líneas epipolares horizontales. Este procedimiento se conecta directamente con el diseño base descrito en Cómo funcionan las cámaras estéreo y Cómo funcionan las cámaras de profundidad.
6. Por qué la deriva de calibración afecta a los sistemas posteriores
Gran parte de las fórmulas matemáticas en Visual SLAM, VO y PnP se basan en la suposición de que los valores de calibración permanecen constantes siempre que las condiciones de disparo no cambien. La estimación de la matriz esencial en la introducción a la geometría epipolar asume coordenadas normalizadas K^{-1}\tilde{\mathbf{x}}; La minimización del error de reproyección en la Guía de PnP también considera que K es un valor conocido. Si K o los coeficientes de distorsión ya no coinciden con el sistema óptico real, todos estos cálculos se realizan, en la práctica, con una regla incorrecta.
En concreto, los valores de calibración se degradan silenciosamente por razones como las siguientes:
-
Cambios de zoom/enfoque: con un objetivo cuya distancia focal varía, f_x,f_y cambia entre tomas. Si se activa el autoenfoque, los parámetros intrínsecos en el momento de la calibración y durante la ejecución no coincidirán.
-
Temperatura y choques mecánicos: un ligero desplazamiento de la posición del objetivo o del soporte del sensor mueve el punto principal y los coeficientes de distorsión. Esto es especialmente importante en aplicaciones para exteriores, automoción y drones.
-
Cambios en la resolución, recorte o zoom digital: dado que K es un parámetro de unidad de píxel, si la imagen se redimensiona o recorta, f_x,f_y,c_x,c_y también debe actualizarse según la escala. Olvidar hacerlo es un error muy común.
-
Deformación de un sistema de cámara izquierda/derecha: en configuraciones estéreo, si la pose relativa (calibración extrínseca) —no solo los parámetros intrínsecos— varía ligeramente con el tiempo, se produce un error sistemático en la profundidad calculada a partir de la disparidad.
Estos errores son difíciles de detectar en una única estimación de pose aislada. Sin embargo, en sistemas que integran la pose secuencialmente a lo largo del tiempo, como VO o SLAM, el error de reproyección sistemático se acumula como deriva, produciendo un mapa distorsionado que el cierre de bucle no puede corregir por completo. En los sistemas de producción, es recomendable monitorizar la deriva de calibración en línea utilizando características 3D fijas y conocidas (líneas rectas en un edificio, letreros de tamaño conocido), o bien incorporar una rutina de recalibración periódica.
7. Fallos comunes y contramedidas
| Patrón de fallo | Qué sucede | Contramedida |
|---|---|---|
| Diversidad de poses insuficiente (solo tomas frontales) | K y la distorsión se determinan con dificultad, especialmente k_3 y el punto principal | Tomar fotografías en las cuatro esquinas de la imagen, el centro y varios ángulos de inclinación diferentes |
| Patrón deformado fuera de un plano | La premisa misma de la calibración se rompe, propagando un error sistemático | Montar sobre un panel plano rígido; corregir los errores de escala de impresión mediante medición física |
| Precisión baja en la detección de esquinas | Aumenta el margen de error de reproyección independientemente del poder expresivo del modelo | Corrección de subpíxeles, resolución suficiente, gestión del enfoque y la exposición |
| Aplicación de un modelo de distorsión estenopeica convencional a un objetivo gran angular | Error divergente en los bordes de la imagen, optimización inestable | Elegir un modelo que se ajuste al campo de visión, como un modelo ojo de pez |
| No actualizar K tras redimensionar/recortar | El punto principal y la distancia focal se desincronizan con la escala, lo que provoca un error sistemático en la estimación de la pose | Convertir K a la escala correspondiente en cada transformación de imagen |
| Ignorar el obturador rodante | El centro de proyección real difiere fila por fila, incluso dentro de un mismo fotograma | Adoptar un obturador global o corregir con un modelo de sincronización de filas |
8. Resumen
La calibración de la cámara es el primer paso que transforma una imagen de «una simple matriz 2D» en «una observación geométricamente interpretable». Los parámetros intrínsecos y extrínsecos del modelo de estenopeico, junto con los coeficientes de distorsión radial y tangencial, se recuperan a partir de observaciones en varias poses —como en el método de patrón planar de Zhang— y se finalizan con una optimización no lineal del error de reproyección. La calidad de esta calibración no se refleja en la métrica de precisión de ningún algoritmo en particular, pero es la premisa subyacente a cada ecuación en cada etapa posterior: geometría epipolar, PnP, Visual SLAM, SfM, ajuste de haces. La calibración no es un ritual único, sino parte de un proceso que debe supervisarse continuamente a medida que cambian las condiciones de disparo.
¿Es suficiente un pequeño error en una imagen de calibración?
El ajuste podría favorecer esa visión.
Compruebe las distintas inclinaciones, los bordes de la imagen y las imágenes de validación por separado. ## Referencias - [Zhang, Una nueva técnica flexible para la calibración de cámaras (IEEE TPAMI, 2000)](https://doi.org/10.1109/34.888718) - [Heikkilä y Silvén, Un procedimiento de calibración de cámara en cuatro pasos con corrección implícita de imagen (CVPR 1997)](https://dl.acm.org/doi/10.5555/794189.794489) - [Hartley y Zisserman, Geometría de múltiples vistas en visión por computadora (página oficial de los autores)](https://www.robots.ox.ac.uk/~vgg/hzbook/) - [OpenCV: Calibración de cámara y reconstrucción 3D](https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html) - [OpenCV: Tutorial de calibración de cámara](https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html) - [OpenCV: Módulo de calibración de ojo de pez](https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html) - [Kalibr (herramienta de calibración de cámara/IMU, repositorio oficial)](https://github.com/ethz-asl/kalibr)
Comentarios
Inicia sesión para continuar.
Todavía no hay datos.