Entradas

Mostrando entradas de 2017

PRÁCTICA 2. 3D RECONSTRUCTION. MEJORA

Imagen
En la entrada anterior se puede ver que los resultados que se obtienen presentan bastante ruido, debido a malos emparejamientos. Por ello se ha tratado de mejorar los emparejamientos y filtrar los malos emparejamientos. Para ello se han modificado las siguientes cosas: 1- Los focos de luz que se habían introducido en el mundo de gazebo no se encontraban a la misma distancia de las cámaras. Esto provocaba que una cámara recibiera mayor iluminación que la otra. Para solucionar esto se han desplazado los focos de luz a la misma distancia. 2- Tras varias pruebas se ha visto que al filtrar los bordes, la imagen derecha no tenía exactamente los mismos bordes que la izquierda. Esto introducía errores. Por ello en la imagen derecha los valores de canny son menos restrictivos que los de la imagen izquierda para asegurarnos de que todos los bordes de la imagen izquierda estén en la derecha.   Canny cámara derecha Canny cámara izquierda  3-  Para realizar el emparejamiento

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

PRÁCTICA 1. FOLLOW LINE. PRUEBA 1

Imagen
En esta práctica se trata de conseguir que un coche de la vuelta completa a un circuito. Para ello se deberá realizar el control visual, así como ajustar el control PID. Al hacer la práctica se ha visto que no era necesario un control PID y que con un PD valía, por ello es lo que se ha empleado. El coche posee dos cámaras (derecha e izquierda), pero solo se ha usado la izquierda, ya que con ello era suficiente. La imagen se obtenía con: Obtención de imágenes imageRight = self.cameraR.getImage() imageLeft = self.cameraL.getImage() El control visual se ha hecho umbralizando la imagen con el objetivo de quedarnos con la línea roja del circuito, la cual nos sirve de referencia. Para realizar la umbralización se ha empleado el espacio de color HSV, ya que es más robusto ante cambios de iluminación. En primer lugar se ha transformado la imagen al espacio HSV. Tras esto se ha umbralizado con cv2.inRange en función a un

PRÁCTICA 0. COLOR FILTER

Imagen
En esta práctica se trata de realizar un filtro de color para detectar donde se encuentran unas pelotas en un vídeo. En concreto se ha adaptado dicho filtro a 4 vídeos (pelota_roja.avi,pelota_roja_azul.avi, drone1.mp4 y drone2.mp4). En todos los videos se ha llevado a cabo el siguiente procedimiento: 1) Se aplica un filtro gaussiano para eliminar el ruido con cv2.GaussianBlur. Ejemplo Filtro Gaussiano blur = cv2.GaussianBlur(input_image_Copy ,(3,3),1)) 2) Se transforma la imagen al espacio de color HSV con cv2.cvtColor. Ejemplo Cambio a HSV hsv=cv2.cvtColor(img,cv2.RGB2HSV)) 3) Se realiza una umbralización en función a un rango de valores con cv2.inRange . Ejemplo Umbralización bw = cv2.inRange(hsv, np.array([110,50,50]), np.array([150,100,120])) 4) Se usan transformaciones morfológicas para tratar de me