miércoles, 2 de mayo de 2018

Práctica 2: 3D Reconstruction (Puntos de interés y epipolar)

En esta entrada se va a explicar cómo se calcula los puntos de interés y la epipolar de un punto.


Puntos de interés

El primer paso, como hemos visto en la entrada anterior, es buscar los puntos de interés. Los puntos de interés son los bordes, ya que son los que nos proporcionan más información acerca de la imagen. Para buscar los bordes se ha empleado el filtro de Canny.

Una vez tenemos la imagen binaria de los bordes, se emplea la función np.where que nos devuelve los puntos de la imagen donde hay borde. De esta forma, usando np.where no tenemos que recorrer la imagen, lo cual supondría más tiempo de ejecución. Una vez hayamos hecho esto ya tenemos nuestros puntos de interés.

En la siguiente imagen podemos ver en la GUI la representación de los bordes tanto de la imagen izquierda como de la derecha.



Hay que mencionar que se han tomado como referencia los puntos de la imagen izquierda y los homólogos se buscarán en la imagen derecha.


Epipolar

Para cada punto de interés que tenemos del paso anterior deberemos buscar la epipolar. Para calcular la epipolar se ha seguido el esquema de clase (el cual se describirá a continuación):




La epipolar se calcula para cada punto de interés siguiendo los siguientes pasos:

1.  Transformamos el sistema de coordenadas al de la cámara de la siguiente forma:

pointInOpt = self.camLeftP.graficToOptical(pointIn)

2. Retroproyectamos el punto 2D en el espacio 3D mediante:

point3d = self.camLeftP.backproject(pointInOpt)

3. Obtenemos el rayo de retroproyección. El rayo de retroproyección se calcula haciendo el producto cruzado (para lo que empleamos np.cross) del punto 3D (point3d) y la posición de la cámara izquierda. La posición de la cámara izquierda la obtenemos de la siguiente forma:

positionCamLeft = self.camLeftP.getCameraPosition()

4. Del rayo de retroproyección se tomarán dos puntos que se proyectarán sobre la imagen derecha. Estos puntos se calcularán de la siguiente forma:

projected1 = self.camRightP.project(point3d)

En mi caso se ha tomado el punto que habíamos retroproyectado al espacio 3D, y el punto medio entre el punto retroproyectado en el espacio 3D y la posición de la cámara.  

Estos puntos proyectados tendremos que pasarlos a las coordenadas de la imagen derecha mediante:

p1 = self.camRightP.opticalToGrafic(projected1)

5. Mediante los dos puntos proyectados en la imagen derecha se calculará la epipolar mediante las ecuaciones de la recta.

 En la siguiente imagen se puede ver un punto de interés marcado con un círculo azul y tras esta una imagen de la epipolar de dicho punto pintada en rojo.





 En el siguiente vídeo podemos ver la epipolar de los puntos de interés (se ve cómo se pinta una epipolar tras otra) :


No hay comentarios:

Publicar un comentario