Visión estéreo y medición de distancia - Recuperar información 3D a partir de disparidad
Principios de la visión estéreo - Simular la visión binocular humana
La visión estéreo utiliza dos cámaras en posiciones diferentes (similar a los ojos humanos) para capturar la misma escena, calculando la profundidad a partir de la disparidad (diferencia de posición del mismo punto en ambas imágenes). Mayor disparidad indica que el objeto está más cerca.
Principio básico: Para un sistema binocular con distancia de línea base B y distancia focal f, la relación entre profundidad Z y disparidad d es: Z = B × f / d. Esta es una aplicación directa de la triangulación.
Componentes del sistema:
- Cámara binocular: Dos cámaras colocadas en paralelo, distancia de línea base 5-30cm
- Calibración: Determinar parámetros intrínsecos (distancia focal, punto principal) y extrínsecos (posición relativa)
- Rectificación: Transformar ambas imágenes para alinear filas (simplifica la correspondencia)
- Correspondencia: Encontrar píxeles correspondientes en las imágenes izquierda y derecha
- Triangulación: Calcular coordenadas 3D a partir de la disparidad
Diferencia con estimación monocular de profundidad: La visión estéreo se basa en principios geométricos con precisión cuantificable; la estimación monocular se basa en priors aprendidos con precisión dependiente de los datos de entrenamiento. La visión estéreo es adecuada para escenarios que requieren medición precisa.
Geometría epipolar y rectificación
La geometría epipolar describe las restricciones geométricas entre dos vistas de cámara y es la base matemática de la correspondencia estéreo.
Restricción epipolar: Un punto en la imagen izquierda tiene su correspondiente necesariamente sobre una línea (línea epipolar) en la imagen derecha. Esto simplifica el problema de búsqueda 2D a búsqueda 1D.
Matriz fundamental F: Matriz 3×3 que codifica la geometría epipolar entre dos vistas. Para puntos correspondientes x y x': x'^T F x = 0. Se puede estimar a partir de 8 o más pares de puntos correspondientes.
Rectificación estéreo:
- Transformar ambas imágenes para que las líneas epipolares queden horizontalmente alineadas
- Tras la rectificación, los puntos correspondientes están en la misma fila, la correspondencia solo requiere búsqueda horizontal
- OpenCV:
cv2.stereoRectify()calcula la transformación de rectificación cv2.initUndistortRectifyMap()+cv2.remap()aplican la transformación
Calibración de cámara: Usando un tablero de ajedrez de calibración, cv2.stereoCalibrate() calibra simultáneamente los parámetros intrínsecos y la pose relativa de ambas cámaras. La precisión de calibración afecta directamente la precisión de medición de profundidad.
Correspondencia estéreo - Block Matching y SGM
La correspondencia estéreo es el paso central de la visión estéreo, encontrando puntos correspondientes en las imágenes izquierda y derecha para cada píxel y calculando la disparidad.
Block Matching (BM):
- Para cada píxel de la imagen izquierda, buscar el bloque más similar en la misma fila de la imagen derecha
- Métricas de similitud: SAD (suma de diferencias absolutas), SSD (suma de diferencias cuadradas), NCC (correlación cruzada normalizada)
- Rápido pero resultados ruidosos, impreciso en bordes
- OpenCV:
cv2.StereoBM_create(numDisparities=64, blockSize=15)
SGM (Semi-Global Matching):
- Optimización de caminos en múltiples direcciones (normalmente 8 o 16)
- Equilibra el coste de correspondencia local y la suavidad global
- Calidad muy superior al block matching, algoritmo principal en aplicaciones reales
- OpenCV:
cv2.StereoSGBM_create(minDisparity=0, numDisparities=128, blockSize=5)
Ajuste de parámetros:
numDisparities: Rango máximo de disparidad, depende de la distancia del objeto más cercanoblockSize: Tamaño de ventana de correspondencia. Ventanas grandes suavizan pero pierden detalleP1, P2: Penalizaciones de suavidad SGM. P2 > P1, P2 controla la penalización en discontinuidades de profundidad
Correspondencia estéreo con aprendizaje profundo
Los métodos de aprendizaje profundo superan ampliamente a los métodos tradicionales en precisión de correspondencia estéreo, especialmente en regiones con oclusión y texturas débiles.
AANet (2020): Usa agregación adaptativa en lugar de convoluciones 3D para construir el volumen de costes, rápido y preciso. Cercano a tiempo real en KITTI.
RAFT-Stereo (2021): Adapta la arquitectura de flujo óptico RAFT a la correspondencia estéreo. Actualiza iterativamente la estimación de disparidad, alcanzando el estado del arte en los benchmarks Middlebury y ETH3D.
CREStereo (2022): Red recurrente en cascada que refina progresivamente la disparidad de grueso a fino. Primer puesto en múltiples benchmarks.
Métodos auto-supervisados: No requieren mapas de disparidad ground truth para el entrenamiento. Usan restricciones de consistencia izquierda-derecha y pérdida fotométrica para aprendizaje auto-supervisado. Adecuados para escenarios donde el ground truth es difícil de obtener.
Estéreo en tiempo real con aprendizaje profundo: HITNet (Google) logra correspondencia estéreo en tiempo real en dispositivos edge. MobileStereoNet optimizado para dispositivos móviles. Despliegue con TensorRT puede alcanzar 30+ fps.
Conversión de mapa de disparidad a nube de puntos 3D
Convertir el mapa de disparidad en coordenadas 3D, generando una nube de puntos utilizable para medición y visualización.
Fórmulas de conversión:
X = (u - cx) × Z / fY = (v - cy) × Z / fZ = B × f / d
Donde (u,v) son coordenadas de píxel, (cx,cy) es el punto principal, f es la distancia focal, B es la línea base y d es la disparidad.
Implementación OpenCV:
Q = cv2.stereoRectify(...)[4] # Matriz de reproyecciónpoints_3d = cv2.reprojectImageTo3D(disparity, Q)
Filtrado de nube de puntos:
- Eliminar puntos correspondientes a disparidad inválida (d=0 o negativa)
- Eliminar puntos demasiado lejanos (disparidad muy pequeña, baja precisión)
- Filtrado estadístico para eliminar valores atípicos
Análisis de precisión: La relación entre precisión de profundidad y precisión de disparidad: ΔZ = Z² / (B×f) × Δd. A mayor distancia, el mismo error de disparidad produce mayor error de profundidad. Esta es una limitación inherente de la visión estéreo.
Visión estéreo práctica - Construcción de sistemas y aplicaciones
Selección de hardware, proceso de calibración y aplicaciones típicas para construir sistemas prácticos de visión estéreo.
Selección de hardware:
- Consumo: Intel RealSense D435/D455 (infrarrojo activo + estéreo), ZED 2 (estéreo pasivo)
- Industrial: Sistemas binoculares Basler, pares de cámaras sincronizadas FLIR
- DIY: Dos cámaras USB del mismo modelo + soporte fijo
Proceso de calibración:
- Imprimir tablero de calibración de ajedrez (9×6 o 7×5 esquinas internas)
- Capturar 20-30 pares de imágenes desde múltiples ángulos
cv2.findChessboardCorners()detecta esquinascv2.stereoCalibrate()calcula parámetros de calibración- Error de reproyección < 0.5 píxeles indica buena calibración
Escenarios de aplicación:
- Evasión de obstáculos en robots: Mapa de profundidad en tiempo real para planificación de trayectorias
- Medición industrial: Medición dimensional sin contacto, precisión hasta 0.1mm
- Conducción autónoma: Estimación de distancia a obstáculos frontales
- AR/VR: Percepción de profundidad para manejo de oclusiones y reconocimiento de gestos