rotacion traslacion y
Transcription
rotacion traslacion y
Introducción a la Realidad Aumentada (parte II) Jairo R. Sánchez Tapia Mar. 2014 Motivación La Realidad Aumentada consiste en combinar objetos virtuales con imágenes tomadas del mundo real, creando sensación de coexistencia entre el mundo virtual y real. Mundo real Introducción a la Realidad Aumenteda Realidad aumentada Realidad virtual Modelo pin-hole • Modelo de cámara básico: Proyección en perspectiva Centro óptico Plano de imagen Punto principal Eje principal X R Y t Z Introducción a la Realidad Aumenteda f XC Y ,f C ZC ZC Modelo pin-hole Parámetros intrínsecos: • Definen el modelo de proyección Parámetros extrínsecos: • Definen la posición y orientación Tracking Tracking Sencillo Rápido Poco preciso Inercial Óptico Introducción a la Realidad Aumenteda Tracking Tracking Sencillo Rápido Preciso ‘Interviene’ la escena Inercial Con marcadores Óptico Introducción a la Realidad Aumenteda Tracking Tracking Rápido Preciso Matching complejo Necesita modelo CAD Inercial Con marcadores Óptico Sin marcadores Introducción a la Realidad Aumenteda Basados en modelo CAD Tracking Tracking Precisos Sin información previa Muy lentos Sólo offline Inercial Con marcadores Óptico Sin marcadores Basados en modelo CAD Sin modelo Introducción a la Realidad Aumenteda SFM Vídeo Argawal Rome in a Day (Argawal et al. 2009) – 150k imágenes – 21 horas en 496 cores A Strochastic Parallel Method for Real Time Monocular SLAM Applied to Augmented Reality Tracking Tracking Tiempo real Sin información previa Poco precisos Muy lentos Inercial Con marcadores Óptico Sin marcadores Basados en modelo CAD SFM Sin modelo SLAM Introducción a la Realidad Aumenteda Agenda HOY: SFM & SLAM Tracking PARTIMOS DE: Marcadores &CAD Inercial Con marcadores Óptico Sin marcadores Basados en modelo CAD SFM Sin modelo SLAM Introducción a la Realidad Aumenteda Descripción del Problema Entrada: Captura Procesamiento de imagen Medidas 2D: Salida: Estimación de movimiento Trayectoria: Estructura 3D: cumpliendo: A Strochastic Parallel Method for Real Time Monocular SLAM Applied to Augmented Reality Estimación de estructura 3D Análisis de Imagen • Es necesario procesar las imágenes para extraer información de alto nivel: Puntos característicos Uniones Blobs Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Bordes Tracking Detección Análisis de Imagen Buscar puntos característicos Calcular descriptores Flujo óptico Filtro de Kalman • Buscar puntos característicos en las zonas inexploradas • Calcular un descriptor para cada punto encontrado • Determinar el desplazamiento de cada punto característico • Comprobar validez del tracking mediante filtros de Kalman Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Implementación Sistema de Realidad Aumentada sin marcadores: 1. Captura de imagen 2. Detección y tracking 2D 3. Reconstrucción 3D 4. Tracking de cámara Documentación: http://docs.opencv.org/ Referencia: Shervin Emami, Mastering OpenCV with Practical Computer Vision Projects Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Estructura del programa Programa compuesto de dos funciones principales: • main: función principal encargada de inicializar el programa • procesarFotograma: función que se llama automáticamente cada vez que el visor está listo para mostrar un fotograma nuevo main procesarFotograma Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Análisis de imagen Objetivo: Detectar y trackear puntos característicos a lo largo de la secuencia de vídeo Tareas: • Implementar la función detectarPuntosCaracteristicos ENTRADA: imagen SALIDA: vector de puntos 2D, descriptores SIFT TIPs: ver clases FeatureDetector y DescriptorExtractor // extraer puntos característicos Ptr<FeatureDetector> detector = FeatureDetector::create("SIFT"); detector->detect(img, puntos); // extraer descriptores Ptr<DescriptorExtractor> descExtractor = DescriptorExtractor::create("SIFT"); descExtractor->compute(img, puntos, descriptores); Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Análisis de imagen Tareas: • Realizar el tracking de puntos característicos en trackearPuntosCaracteristicos ENTRADA: imagen, puntos en fotograma anterior SALIDA: vector de puntos 2D TIPs: usaremos el algoritmo Optical Flow piramidal vector<Point2f> puntos; Mat estado, err; calcOpticalFlowPyrLK(fotogramaAnterior, fotograma, puntosAnteriores, puntos, estado, err); for(int i=0; i<estado.rows; i++) { if(estado.at<unsigned char>(i) == 1) { puntosNuevos.push_back(puntos[i]); } } Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Basado en el efecto de paralaje: M C1 C2 Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Basado en el efecto de paralaje: «La proyección de un punto en la segunda imagen se desplaza dependiendo de su profundidad.» M C1 C2 Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Basado en el efecto de paralaje: «La proyección de un punto en la segunda imagen se desplaza dependiendo de su profundidad.» M C1 • La línea que une las dos proyecciones se llama Línea Epipolar Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… C2 Structure From Motion C1 M m1 m2 C2 Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion C1 m1 l1 M e1 e2 m2 l 2 C2 Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Por definición se cumple: m1 P1M e2 P2C1 • Back-projection: M P m1 C1 1 Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Por definición se cumple: m1 P1M e2 P2C1 • Back-projection: M P m1 1 e2 P2 P1 m1 l2 T m2 e2 P2 P1 m1 0 F Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Por definición se cumple: m1 P1M e2 P2C1 • Back-projection: M P m1 T m2 Fm1 0 1 e2 P2 P1 m1 l2 T m2 e2 P2 P1 m1 0 Matriz Fundamental (3x3 rango 2) F Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Para cada par de proyecciones (m, m’) se cumple: m´ T Fm 0 (M. Pollefeys, 2010) Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Para cada par de proyecciones (m, m’) se cumple: f11 f12 x´ y´ 1f21 f22 f31 f32 f13 x f23 y 0 f33 1 (M. Pollefeys, 2010) Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Para cada par de proyecciones (m, m’) se cumple: xx´ yx´ x´ xy ´ yy´ y´ x f11 f 12 f13 f21 y 1f22 0 f23 f 31 f32 f 33 (M. Pollefeys, 2010) Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Structure From Motion • Con un mínimo de 8 pares de puntos se puede construir un sistema lineal respecto a F Eight point algorithm (Longuet-Higgins, 1981) x1 x1´ x x ´ 2 2 xn xn ´ y1 x1´ y 2 x2 ´ y n xn ´ x1´ x2 ´ xn ´ x1 y1´ x2 y 2 ´ xn y n ´ ~10000 ~10000 ~100 ~10000 y1 y1´ y2 y2´ yn yn ´ ~10000 y1´ y2´ yn ´ x1 x2 xn y1 y2 yn ~100 ~100 ~100 Diferencia significativa en el orden de magnitud de las columnas Solución por mínimos cuadrados falla Hace falta normalizar (Hartley PAMI’97) Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… f11 f 12 f13 1 f 21 1 f 22 0 f 23 1 f 31 1 f 32 f 33 (M. Pollefeys, 2010) Structure From Motion • Normalmente se tiene más de 8 pares de puntos: sistema sobredeterminado Paso 1: Calcular el conjunto de pares de puntos Paso 2: Repetir Paso 2.1: Seleccionar conjunto mínimo (8 puntos) Paso 2.2: Calcular matriz F Paso 2.3: Calcular número de inliers Hasta que #inliers>95% Paso 3: Calcular F usando todos los inliers Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… RANSAC (Fischler, M. 1981) Structure From Motion • En el caso de que la cámara esté calibrada se puede obtener las coordenadas normalizadas de las proyecciones: 1 m̂1 K m1 1 m̂ 2 K m 2 • La matriz Esencial es el caso particular de la matriz Fundamental cuando se conoce la calibración de la cámara: m̂ Em̂1 0 T 2 • Tiene 5 GDL • Depende únicamente de R y 𝑡: Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Ejercicio 2 - Matriz esencial Descomenta la parte de la función main correspondiente al ejercicio 2. El ejercicio tiene cuatro partes: • Calcular puntos característicos en dos fotogramas separados por unos 10 frames • Emparejarlos usando sus descriptores • Calcular la matriz fundamental • Calcular matriz esencial Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Detección & matching Objetivo: Establecer pares de puntos entre fotogramas lo suficientemente separados Tareas: • Usar la función detectarPuntosCaracteristicos del ejercicio anterior • Implementar la función emparejarDescriptores ENTRADA: descriptores de ambos fotogramas SALIDA: emparejamientos de puntos TIPs: ver clase DescriptorMatcher y algoritmo de fuerza bruta // instanciar matcher del tipo fuerza bruta Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce"); matcher->match(d0, d1, matches); // ejecutar el emparejamiento matcher->match(d0, d1, matches); Alternativa: usar el cálculo de flujo óptico. Más rápido pero más líneas de código. Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Matriz fundamental Objetivo: Calcular la matriz fundamental para obtener la reconstrucción inicial Tareas: • Implementar la función calcularMatrizFundamental ENTRADA: puntos de las dos imágenes y sus emparejamientos SALIDA: matriz fundamental F, lista de inliers TIPs: ver función findFundamentalMat Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Matriz fundamental // alinear parejas en dos vectores (requisito de findFundamentalMat) vector<Point2f> points0, points1; points0.resize( pares.size() ); points1.resize( pares.size() ); for(size_t i=0; i<pares.size(); i++) { points0[i] = kp0[ pares[i].queryIdx ].pt; points1[i] = kp1[ pares[i].trainIdx ].pt; } // calcular la matriz Mat status; Mat F = findFundamentalMat(points0, points1, CV_FM_RANSAC, 1.0, 0.99, status); // extraer inliers for(size_t i=0; i<points0.size(); i++) { if(status.at<unsigned char>(i) == 0) continue; inliers0.push_back( points0[i] ); inliers1.push_back( points1[i] ); } return F; Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Matriz esencial Objetivo: Calcular la matriz esencial a partir de la matriz fundamental Tareas: • Implementar la función matrizEsencial ENTRADA: matriz de calibración y matriz fundamental SALIDA: matriz esencial TIPs: si T m2 Fm1 0 y m̂ T2 Em̂1 0 pues echa cuentas… Mat E = K.t()*F*K; matcher->match(d0, d1, matches); return E; Alternativa: calcularla con findFundamentalMat pero usando coordenadas normalizadas Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Reconstrucción de estructura • La posición 3D de los puntos característicos se calcula mediante triangulación lineal. Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Ejercicio 3 – Reconstrucción 3D Descomenta la parte de la función main correspondiente al ejercicio 3. El ejercicio tiene dos partes: • Extraer la rotación y traslación de la matriz esencial • Triangular los puntos 3D Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Extraer matriz de rotación y traslación Objetivo: Calcular las matrices de cámara para los dos fotogramas que se usaron para el cálculo de la matriz fundamental. Tareas: • Implementar la función extraerCamaras ENTRADA: matriz de calibración y matriz esencial SALIDA: matrices de cámara para los dos fotogramas P0 K[I | 0] P1 K[R | t ] T Siendo E Udiag (1,1,0)V la descomposición SVD de la matriz esencial se cumple que: P1 UWV T | u3 0 1 0 siendo W 1 0 0 0 0 1 Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Triangular los puntos Objetivo: Calcular la reconstrucción 3D de la escena Tareas: • Implementar la función reconstruccion3D ENTRADA: pares de puntos y matrices de cámara de los dos fotogramas SALIDA: estructura 3D de la escena TIPs: ver la función triangulatePoints Mat reconstruccion; triangulatePoints(P0, P1, input0, input1, reconstruccion); matcher->match(d0, d1, matches); return reconstruccion; Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Añadir Nuevas Vistas • Cuando llega una nueva vista se calcula su pose usando emparejamientos 2D-3D que se pueden inferir a partir de los pares 2D-2D. Partiendo de m [ R | t ]M m PM 0 M m (M. Pollefeys, 2010) Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Ejercicio 4 – Añadir nuevas vistas Descomenta la parte de la función procesarFotograma correspondiente al ejercicio 4. El ejercicio tiene dos partes: • Modificar trackearPuntosCaracteristicos para hacer el emparejamiento 2D-3D • Hacer el cálculo de la transformación Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Emparejamientos 2D-3D Objetivo: Para cada punto 2D devuelto por el optical flow, determinar su correspondecia en la reconstricción 3D. Tareas: • Modificar la función trackearPuntosCaracteristicos SALIDA: puntos 3D alineados con puntosNuevos vector<Point2f> puntos; Mat estado, err; vector<Point3f> matching3D; calcOpticalFlowPyrLK(fotogramaAnterior, fotograma, puntosAnteriores, puntos, estado, err); for(int i=0; i<estado.rows; i++) { matcher->match(d0, d1,char>(i) matches); if(estado.at<unsigned == 1) { puntosNuevos.push_back(puntos[i]); matching3D.push_back( _reconstruccion[i] ); } } _reconstruccion = matching3D; Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Añadir nuevas vistas Objetivo: Calcular la rotación y traslación para cada fotograma Tareas: • Implementar la función trackearCamara ENTRADA: emparejamientos 2D-3D SALIDA: matriz de transformación TIPs: ver las funciones solvePnPRansac y Rodrigues Mat vecRotacion, traslacion; Mat transformacion(3, 4, CV_64FC1); solvePnPRansac(puntos3D, proyecciones, _intrinsecos, Mat(), vecRotacion, traslacion, false, 100, 1.0, 500); matcher->match(d0, d1, matches); Rodrigues(vecRotacion, transformacion.colRange(0, 3) ); traslacion.copyTo( transformacion.colRange(3, 4 ) ); return transformacion; Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Ajuste de la Estructura • Debido a errores es necesario ajustar la estructura y matrices de cámara. • Función objetivo: Reconstrucción por geometría epipolar Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro… Bundle Adjustment Resumiendo… Inicializar estructura Inicializar cámaras con F Ajustar estructura (BA) Extender con nuevas vistas Introducción > Análisis de Imagen > SFM > SLAM > Implementación > Futuro…