martes, 14 de mayo de 2013

Visión computacional vs MEMS

Presentación



Propósito y Justificación


Como primer objetivo el proyecto consiste en realizar medidas angulares a través de visión computacional, como una alternativa al uso de MEMS.
A partir de una medición a distancia (visual), se espera evitar los problemas de ruido que se tienen al realizar las mediciones con un dispositivo sobre la plataforma.
Como resultado se pretende obtener un comparativo del uso de sistemas de visión vs sensores (infrarrojos, ultrasonido, MEMS), ilustrando sus puntos fuertes y desventajas.
Una técnica alternativa al uso de MEMS para realizar medidas angulares de los brazos de un robot o posicionamiento general.
La técnica se basa en el uso de visión computacional para detectar el movimiento del robot.
Se pretende tener una comparación de las medidas que se obtuvieron con los sensores contra las que se obtienen con las imágenes que la cámara capta.

Diseño del software

El programa se divide en varias funciones importantes que son:
  • Procesamiento: la función se encarga de leer cada frame y de mandar llamar las funciones necesarias para procesarlas.
  • Detección  de líneas: Primero se pasa la imagen a escala de grises, después de eso se hace difusa la imagen y se binariza para poder eliminar el ruido, enseguida se buscan los bordes y por último se aplica la función para encontrar las líneas.
  • Eliminar basura: encuentra solamente la línea que se ocupa dejando afuera cualquier otro ruido que pudiera afectar en las mediciones
  • Leer xls, esto se hace para poder comparar los datos proporcionados por los MEMS y graficarlos juntos con los obtenidos.
Aquí el proceso:

Primero el frame a escala de grises:


Ahora se aplica el filtro blur y se binariza:

Así se obtienen los contornos:
 

 Ahora se tiene una imágen que detecta muchas líneas en la figura:



Se hace un filtro que elimina las líneas por tamaños y posiciones inadecuadas:
















Ahora si se detecta correctamente las líneas en los frames. Entonces se procede a calcular en angulo en radianes para cada una de ellas, para después poder compararlo con los datos que ya se tenían.

Descripción textual

Viendo el proyecto un poco más del lado del programador y de la visión computacional lo que en realidad hace el programa es la detección de líneas formateando aquellas que no cumplen con las características del brazo del robot.
El siguiente es un diagrama que puede enseñarnos de manera mas gráfica el funcionamiento de las entradas, salidas y el proceso del software:

Se obtiene cada frame del vídeo y cada una de ellas pasa por el proceso descrito en el cuadro verde, utilizando la librería de opencv, primero se pasa a escala de grises, después a blur, enseguida se binariza, se encuentran los contornos, las líneas y se elimina la basura es decir todas aquellas líneas encontradas que no cumplen con las características del brazo del robot ya sea pendiente, largo, posición etc.
Los resultados son una lista de los ángulos en radianes que se midieron teniendo las líneas así como una gráfica ilustrando eso mismo y el vídeo con el dibujo de la línea.

Librerías utilizadas

Como lenguaje de programación se utilizó python, con las librerías OpenCV ya que contiene muchos módulos que realizan los algoritmos de manera rápida y optima, y tiene funciones que ayudan a manejar los vídeos, ya que yo en mi caso es lo que utilizo.

  • OpenCV
    • Blur (hacer la imágen difusa)
    • Edge detection (obtener los contornos)
    • HoughLinesP (las líneas en la imagen)
  • Para las gráficas lo que se uso fue matplotlib que ayuda a gráficar desde python así como facilita las gráficas en tiempo real.
  • Numpy, se utiliza para ayudar a matplotlib a hacer las gráficas con los valores de los ejes más ordenados o generados con menos líneas de código.

Desempeño

El vídeo contiene 30 frames por lo que lo ideal sería que se alcanzaran a procesar en tiempo real y no haya ningún tipo de atraso ni se brinquen frames, esta es la gráfica que muestra el desempeño:

Y el tiempo transcurrido en total es de 64 segundos, siendo que el vídeo original tiene una duración de 1 minuto y 33 segundos.
Se procesan aproximadamente 43 frames por segundo.



Trabajo a futuro

En una etapa posterior el proyecto se enfocaría en efectuar mediciones de las coordenadas inerciales de drones y vehículos terrestres.
Como resultado se pretende obtener un comparativo del uso de sistemas de visión vs sensores (infrarojos, ultrasonido, MEMS), ilustrando sus puntos fuertes y desventajas.
Una vez comprobado que la visión computacional si funciona es posible instalar alguna cámara fija enfrente del robot para poder estar calculando sus ángulos.
Se podría comenzar a desarrollar un sistema web que realice las mediciones en tiempo real en un servidor para estar mandando las imágenes por internet y poder controlar desde lejos los movimientos de los brazos del robot.

Conclusiones




En la gráfica podemos ver resultados satisfactorios del uso de la visión computacional ya que arroja resultados casi idénticos a los que se tienen registrados por los MEMS, entonces es totalmente factible utilizar esta técnica por lo menos para medir el ángulo de los brazos de un robot en 2 dimensiones. Teniendo estos resultados se puede seguir adelante con el propósito que se tiene que es poder hacer mediciones de coordenadas de los drones, etc.

>>REPOSITORIO

Referencias

Rahman, Abid. (June 2012). Countours. OpenCV Python Tutorials. Recuperado en Mayo de 2013 desde: http://opencvpython.blogspot.mx/2012/06/hi-this-article-is-tutorial-which-try.html

3 comentarios:

  1. El archivo install típicamente se nombra en toda mayúscula. Agrega referencias, si tienes, en el reporte. 10 pts por la presentación.

    ResponderEliminar
  2. En el reporte hay algunos detalles menores de ortografía. Van 9 pts por ello. El repositorio está bastante bien, también van 9 pts ahí.

    ResponderEliminar