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´ 1f21 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 1f22   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…