Práctica 2. Reconstrucción 3D: Línea epipolar

El objetivo de la segunda práctica es dotar a un robot de la capacidad de reconstruir su entorno en 3D a través de dos cámaras estéreo.

Para conseguir este objetivo, seguiremos los pasos indicados en la teoría de Reconstrucción 3D de los apuntes de Visión Robótica:

  1. Obtención de Puntos de interés
  2. Búsqueda del punto homólogo
  3. Triangulación
  4. Representación

Así mismo, nos guiaremos a partir a la imagen de representación de funcionamiento de la Reconstrucción 3D mostrada en los apuntes y en los foros de ayuda:

Para el primer paso, aplicamos un filtro de Canny a la imagen izquierda de nuestra cámara, lo cual nos dará los bordes de la imagen. A partir de ahí recorremos la imagen binaria resultante, y los puntos que valgan 1 – sean parte de los bordes – serán nuestros puntos de interés. Lo siguiente, será buscar la línea epipolar del punto en la otra imagen.

Para cada punto de interés realizaremos los pasos indicados en los comentarios del código de la práctica:

  • opticalToGrafic: Convierte el punto de la imagen gráfico, en óptico. Toma como Origen de coordenadas la posición de la cámara.
  • backproject: Convierte el punto óptico en su representación 3D, sabiendo que esta conversión será parte de la recta de retroproyección.
  • project: Proyecta el punto 3D en el plano de la cámara derecha, en coordenadas ópticas.
  • graficToOptical: Convierte el punto óptico a coordenadas gráficas.

Así mismo, para poder obtener la recta epipolar necesitaremos dos puntos, por lo que deberemos obtener la recta de retroproyección de la cámara izquierda y proyectar otro de sus puntos sobre la cámara derecha. Sólo así podremos calcular la epipolar correctamente. Esto lo haremos de la siguiente forma:

p1 = Punto de interés
posCam = self.camLeftP.getCameraPosition
v = p1 – posCam (vector de proyección)
p2 = p1 + v * k (K será un desplazamiento cualquiera)

En mi caso tuve ciertos problemas con la coordenada homóloga, que vale 1 y sirve para el cálculo de la proyección a través de la matriz KRT, y que al tenerse en cuenta en las operaciones no mantenía ese valor de unidad, dando resultados incorrectos. Una vez se hicieron las operaciones sólo con las 3 coordenadas de posición se pudo obtener la recta epipolar correctamente, tal como se puede ver en la imagen (con varios ejemplos de K):

Con esto ya obtendremos un segundo punto que podremos proyectar sobre la cámara derecha y con el que podremos calcular la recta epipolar, siguiendo de nuevo la fórmula de la recta:

El siguiente paso será buscar a partir de esa recta una franja – con varios pixeles arriba y abajo para evitar errores de calibración de la cámara – y recorrerla buscando el parche más parecido al punto de interés de nuestra cámara izquierda. Así encontraremos el punto de interés en la segunda cámara y ya sí podremos obtener la posición 3D de dicho punto