En este blog se irán describiendo todos los avances realizados por Vicent Avaria Avaria en las prácticas de Visión Robótica del Máster Oficial de Visión Artificial - URJC - Móstoles

domingo, 26 de marzo de 2017

2-Práctica1 Follow_Line

Después de realizar el estudio del script My_algorithm.py encargado de controlar el Formula 1, se vio la necesidad de tener variables self. para poder controlarlo óptimamente.

Para conseguir que el Formula 1 diése una vuelta entera al circuito, como se puede ver en el vídeo "Vuelta completa en 4:56" ha sido necesario crear tres variables nuevas:

-self.v, para controlar la velocidad del coche.
-self.xf, para guardar el valor x de la boundingbox que engloba la línea elegida.
-self.iteration, para controlar en que iteración se encuentra actualmente.
-self.i, para contabilizar el número de interaciones que el Formula 1 se encuentra dentro del umbral de recta.

Con estas variables creadas se ha elegido un rango de líneas de la mitad inferior de la imagen, de la 20 a la 29 (sin sumar la mitad de la imagen), y se ha detectado su bounding box para extraer el valor de x. En la primera iteración se guardará el valor de la x en self.xf, ya que se tiene en cuenta que el Formula 1 se encuentra centrado en la línea.

Una vez se tenga self.xf guardada se ha creado un umbral de recta para determinar que el Formula 1 se encuentra centrado, por lo tanto el Formula 1 se encontrará en el centro de la línea si:

-self.xf*0.9<x<self.xf*1.1

En caso de que el formula 1 no se encuentre en este umbral, se comprueba si la nueva x es menor o mayor que self.xf. Sabiendo si es menor o mayor se sabe si se encuentra en una curva hacia izquierdas y hacia derechas. Por lo tanto se realiza una disminución de velocidad a una constante (1) y se le añade una velocidad de rotación que se ha determinado por el método de prueba y error, y aquel valor que no falla es -0.3 y 0.3.

Una vez comprobado que el Formula 1 completa una vuelta entera se ha comprobado que en las rectas se pierde mucho tiempo. Como se tiene guardado el número de iteración actual dentro del umbral de recta en self.i se ha utilizado este valor para aumentar el valor de la velocidad. En concreto cada múltiple de 25 la variable self.v aumenta 3 puntos. Para realizar este ajuste también se ha realizado por el método de prueba y error.
Con los puntos anteriores se observa que aunque no consigue dar una vuelta en menos de 2:15 (récord actual) se consigue dar la vuelta completa sin ningún error.

Vuelta completa en 4:56

miércoles, 8 de marzo de 2017

1-Práctica1 Follow_Line

Esta práctica consiste en que un Formula 1 pueda recorrer un circuito con la única ayuda de una línea que se encuentra en el centro del circuito.

Para ello es necesario realizar una detección de esa línea. A través de un filtro de color similar al de la práctica 0. En este caso se ha grabado un vídeo donde se puede ver el color de la línea para pasarlo por la aplicación ColorTuner y extraer los valores de H, S y V óptimos para su detección. Teniendo en cuenta que H va de 0 a 2*(pi), por lo tanto ha de transformarse de 0 a 180 para el filtro de color. S va de 0 a 1 y hay que transformarlo de 0 a 255 y finalmente V ya se encuentra normalizado de 0 a 255. 

Posteriormente, como dice el enunciado de la práctica es recomendable realizar este filtrado tan solo en la mitad inferior de la imagen, quedándose con la carretera para optimizar la carga computacional. En este caso, por mal entendimiento, se intentó primero realizar un filtrado tan solo de líneas pares, que finalmente no dio ningún resultado óptimo y se procedió a utilizar tan solo la mitad inferior de la imagen.

Durante el proceso de visualización del filtrado de color hubo problemas ya que daba errores incomprensibles. Finalmente se encontró el fallo y era que la imagen procesada debía tener canales RGB, por eso se procedió a dejar la línea roja y el resto en negro.

Para comprobar si funcionaba en todo el circuito el filtrado, se controló el coche desde el pad que facilita la práctica, obteniendo el siguiente resultado:

Follow_Line 1

sábado, 18 de febrero de 2017

2-Práctica0 Color_filter (Fin)

Ahora con los vídeos más difíciles, drone1.mp4 y drone2.mp4, como es más complicado obtener una umbralización buena de las pelotas, es imposible eliminar completamente parte de la caja o del fondo, ya que debido a la mala calidad del vídeo se confunde con las pelotas. Por lo tanto para poder realizar una segmentación adecuada, ha sido necesario realizar un filtrado utilizando restricciones de tamaño y de relación de aspecto. Primeramente se probó con valores aleatorios y observando que no eran los adecuados se procedió a controlar cuales eran los tamaños mínimos y máximos de relación de aspecto así como su tamaño mínimo. Los mejores valores que se encontraron fueron (contornos):

-Altura y anchura mayor que 15 píxeles.
-Relación de aspecto (altura/anchura) mayor que 0.6 y menor que 1.

En la búsqueda de los mejores valores de HSV con la aplicación ColorTuner se observó que era muy complicado umbralizar las pelotas adecuadamente cuando el drone se alejaba. El problema era que las pelotas se confundían mucho con la caja y su máscara se juntaba con la caja, dejando inservible tanto la detección cuando se alejaba y cuando estaba cerca. Por esto mismo se decidió no tener en cuenta cuando el drone está lejos.

En los siguientes vídeos se pueden observar los resultados obtenidos:

 
 drone1.mp4

  
drone2.mp4

jueves, 16 de febrero de 2017

1-Práctica0 Color_filter

En esta práctica se intentará detectar donde se encuentran una pelota roja y una azul así como su segmentación, todo esto a través de funciones de la biblioteca OpenCV.

Para realizar esta práctica ha sido necesario transformar las imágenes que se tratarán al formato HSV, ya que de esta manera es más fácil encontrar los valores adecuados. Después con los valores obtenidos por la aplicación ColorTuner (ya implementada en Jderobot) se pueden encontrar los valores adecuados para umbralizar las pelotas de color.

Más tarde con la función findContours de OpenCV podemos segmentar las pelotas con tan solo quedarse con aquel contorno que tenga valores más grandes.

Se prueba primero con el vídeo pelota_roja.avi obteniendo el siguiente resultado:
Pelota_roja.avi
-------------------------------------------------------------------------------------

En el siguiente vídeo, pelotas_roja_azul.avi, es necesario realizar los mismos pasos que para detectar la pelota roja en el ejemplo anterior. Pero esta vez como se tienen ambos colores y se quiere detectar ambas a la vez, es necesario realizar la umbralización y la segmentación de ambas en paralelo para después sumar las máscaras. Finalmente se obtiene el siguiente resultado:

 
pelotas_roja_azul.avi