Entradas

Mostrando entradas de mayo, 2017

PRÁCTICA 2. 3D RECONSTRUCTION. TRIANGULACIÓN

Imagen
Con los emparejamientos de puntos ya realizados, podremos hacer la reconstrucción 3D. Dicha reconstrucción consistirá en calcular los rayos de retroproyección de cada punto y con ellos el punto dondeintersectan. Los rayos de retroproyección se obtienen: 1- Retroproyectamos los puntos al espacio 3D. Para ello pasamos los puntos al sistema de la cámara con: pointInOpt=self.camRightP.graficToOptical(pointIn)                 Y los proyectamos en el espacio 3D:  point3d=self.camRightP.backproject(pointIn) 2- Con los puntos en el espacio 3D y la posición de las cámaras podemos calcular los rayos de retroproyección , ya que será la recta que pase por el punto y la posición de la cámara. 3- Una vez tenemos los rayos, el punto 3D debería situarse donde intersectan ambos. Esto no suele ocurrir porque hay errores, por ello se busca el punto que minimiza la distancia entre ambas rectas. Para ello me he basado en la siguiente página: http://www.homer.com.au/webdoc/geomet

PRÁCTICA 2. 3D RECONSTRUCTION. PUNTOS HOMÓLOGOS

Imagen
Una vez tenemos la recta epipolar tal y como se comento en la entrada anterior, ya podemos buscar los puntos homólogos. Para ello emplearemos la correlación para ver cuales son los puntos más parecidos entre ellos. La búsqueda del punto más parecido se hará recorriendo la epipolar y en un margen respecto a ella, pues puede haber errores de calibración. Esta búsqueda se hará mediante parches y comprobando la correlación que haya entre ellos. Cuanto mayor correlación mayor parecido. La búsqueda se realiza tal y como puede observarse en la siguiente imagen: En la imagen anterior se puede ver la epipolar (verde), los márgenes hasta los cuales se busca el punto homólogo (amarillo) y los parches con los cuales se realiza la correlación (azul). La correlación se realizará en el espacio HSV. Con todo esto se obtendrá algo como lo siguiente:

PRÁCTICA 2. 3D RECONSTRUCTION . PUNTOS DE INTERÉS Y EPIPOLAR

Imagen
En esta entrada se comentará como se obtienen los puntos de interés y como se calcula la epipolar de un punto. Puntos de interés Para obtener los puntos de interés se ha usado un filtro Canny, es decir se han detectado los bordes.  Con la imagen de bordes empleamos np.where para saber en que puntos de la imagen hay borde. Una vez hayamos hecho esto ya tendremos los puntos de interés. Hay que decir que se han tomado como referencia los puntos de la imagen izquierda y los homólogos se deben buscar en la imagen derecha. Epipolar Para cada punto de interés será necesario calcular su epipolar. Esta epipolar se calculará de la siguiente forma: 1 - Transformamos el sistema de coordenadas al de la cámara con: pointInOpt = self.camLeftP.graficToOptical(point_interes) 2- Retroproyectamos el punto en el espacio 3D con: point3d=self.camLeftP.backproject(pointInOpt)  3- Obtenemos rayo de retroproyección. Para eso hacemos el producto cruzado(np.cross) del pun

PRÁCTICA 2. 3D RECONSTRUCTION

En esta práctica se pretende realizar una reconstrucción 3D a partir de un par estéreo. Para ello se emplea el entorno gazebo donde habrá un mundo el cual observaremos con las cámaras y reconstruiremos en 3D. Esta reconstrucción 3D se proyectará en el espacio 3DViewer. La práctica la ejecutaremos usando los siguientes comandos: Ejecución viendo el mundo: gazebo reconstruccion3D.world Ejecución del visor 3D: 3DViewer 3DViewer.cfg Ejecución del ejemplo: python2 3d_reconstruction.py 3d_reconstruction.cfg  Para llevar a cabo la práctica se deben seguir los siguientes pasos: Obtener puntos de interés Encontrar los puntos de la imagen derecha que se corresponden con los de la izquierda, es decir, los homólogos. Para esto se debe usar la epipolar. Realizar triangulación para hacer la reconstrucción 3D mediante los pares de puntos.  

PRÁCTICA 1. FOLLOW LINE. PRUEBA 4

Imagen
En esta prueba se ha tratado de mejorar los resultados anteriores. Tal y como se ha dicho en entradas anteriores, se emplean tres centros de la línea roja. Cada uno de estos centros situados en diferentes posiciones y de la imagen. En este caso se ha buscado el centro de la línea roja en las posiciones: y1= 260 y2 = 310 y3 = 350 El centro situado en y1 al encontrarse más arriba será el único que no perderemos siempre que nos encontremos cerca de la línea roja. Los centros situados en y2 e y3 es posible que se pierdan al llegar a una curva grande. Lo cual introducirá errores. Como ya se comento en entradas anteriores, con los centros situados en y1 e y3 se calcula la recta que pasa por ambos. Una vez tenemos esta recta podemos saber si el centro calculado en y2 pertenece a ella. Sabiendo todo esto se han llevado a cabo los siguientes pasos: Se comprueba si el centro situado más arriba(y1) se ha localizado o no.Si no ha sido localizado quiere decir que se ha perdi

PRÁCTICA 1. FOLLOW LINE. PRUEBA 3

Imagen
Para tratar de mejorar los resultados se han aplicado dos controles PD en curva en función de la desviación que se tenga. También se ha realizado un caso en el que no se detecte la línea, es decir si el coche se sale del circuito. En dicho caso deberá ir hacia atrás y girar hacia el circuito para continuar su recorrido. Si la última vez que se ha visto la línea estaba a la izquierda de la imagen,querrá decir que el coche se ha salido hacia la derecha y por tanto tendrá que girar a la izquierda y viceversa. Un ejemplo de ello se puede ver a continuación: Hay que decir que con todo esto aún sigue habiendo oscilaciones. En algunas ocasiones se pierde una de las filas donde buscamos el centro introduciendo confusiones entre recta y curva. Esto hace que a veces en recta se aplique un control de curva y se introduzcan errores que darán lugar a oscilaciones.

PRÁCTICA 1. FOLLOW LINE. PRUEBA 2

Imagen
En la segunda prueba se ha modificado el control PD realizado en la prueba anterior.En este caso, se ha buscado el centro de la línea en tres filas de la imagen, para poder saber si nos encontrábamos en recta o curva. Con los dos centros situados más arriba se ha estimado cual es la recta que pasaría por ellos. Una vez se tiene esta recta, se puede saber si dicha recta corta el centro situado más abajo. Si la recta corta el punto se considerará que nos encontramos en recta y sino en curva. Para las rectas se han hecho tres controles PD dependiendo de la desviación que presentaba el coche. Y para las curvas se ha usado otro control PD. Por lo que en función de la desviación que tiene y de si está en recta o en curva se aplicarán unos valores u otros en self.motors.setV() y self.motors.setW(). En el control PD se sigue la siguiente fórmula: Control PD corrección = Kp*error + Kd*(error - error_anterior) Kp es la constante apli