viernes, 19 de junio de 2015

Reconstrucción 3D

El objetivo de la segunda práctica de la asignatura es hacer una reconstrucción 3D valiéndonos del par estéreo con el que viene equipado nuestro robot. Se posee la información de calibración de las cámaras.



El primer paso que se hace, debido a restricciones de procesamiento, es una reducción de la cantidad de pixeles que tomaremos en cuenta para hacer la reconstrucción. En este caso se hizo esto utilizando un detector de bordes de Canny, aunque se podría haber utilizado FAST u otro tipo de puntos de interés.



Se registran todos los puntos de borde de la imagen izquierdad y vamos uno por uno ejecutando el siguiente algoritmo:

  1. Se retroproyecta el pixel al espacio, obteniendo un punto de la recta que pasa por todos los puntos del espacio que proyectan a ese pixel.
  2. Buscamos un segundo punto dentro de esta recta, como por ejemplo un punto intermedio entre el centro óptico de la cámara y el punto que obtuvimos retroproyectando.
  3. Proyectamos ambos puntos (3D) a la cámara derecha.
  4. Se resuelve la ecuación de la recta para este par de puntos en la imagen de la cámara derecha. Con esto podemos obtener la recta que junta estos dos puntos, la cual sería nuestra línea epipolar.
  5. Se crean dos máscaras: una que representa nuestra restricción epipolar y otra que representa una restricción de proximidad. Para validar que un punto en la imagen izquierda corresponde a otro punto en la imagen derecha se debe cumplir tanto que ese punto este sobre la línea epipolar como que se encuentre en una coordenada cercana. La aplicación de estas restricciones dan como resultado una lista de puntos candidatos a ser pareja del punto seleccionado.
  6. A continuación se toma un parche de la imagen centrado en el punto que estamos estudiando y se compara mediante correlación con parches centrados en cada uno de los puntos candidatos y se toma el punto que obtiene la mejor correlación (siempre y cuando sea una correlación lo suficientemente alta)
  7. El punto obtenido se retroproyecta al espacio, con lo cual podemos obtener otra recta con todos los puntos del espacio que proyectan sobre este pixel.
  8. Buscamos el punto en el que la distancia entre estas dos rectas es menor y se toma el punto intermedio entre ambas líneas. Este será nuestro punto de reconstrucción.
  9. Junto a ese punto en 3D se registra también el color del píxel en la imagen izquierda.
  10. Finalmente se dibujan todos los puntos obtenidos en el 3D, con su color.


En este caso las cámaras del robot se encuentran en configuración canónica, por lo que todas las líneas epipolares son horizontales, a la misma altura que el pixel que estamos estudiando. Sin embargo el algoritmo trabajaría exactamente igual con una configuración distinta de cámaras.

El tiempo de reconstrucción es alto, aproximadamente 45 segundos. El cálculo de las líneas epipolares toma un tiempo considerable, por lo que se recomienda hacer una rectificación de la imagen derecha para garantizar que nuestras epipolares siempre serán horizontales y ahorrar cálculo.

Otra mejora posible es que se reconstruyen puntos falsos detrás del robot. Esto se debe a que al buscar el punto en el que la distancia entre las rectas de retroproyección es mínimo no se está haciendo una restricción de distancia entre las rectas.

No hay comentarios:

Publicar un comentario