Mostrando entradas con la etiqueta Visión Computacional. Mostrar todas las entradas
Mostrando entradas con la etiqueta Visión Computacional. Mostrar todas las entradas

miércoles, 15 de mayo de 2013

Lab: Detección de movimiento

Para esta entrada se nos pide realizar un la detección de movimiento de una secuencia de imágenes por lo que para esto tengo una secuencia de imagenes que las voy combinando con frames e ir calculando su histograma y calcular su entropia, si la entropia es menor a 2.0, quiere decir que no hay movimiento en la imagen, luego checo en base a los filtros, en la diferencia, la cantidad donde existen blancos, de esta manera pongo una flecha que indica el movimiento de la imagen.

De esta manera podemos saber si existe movimiento o no en la imagen, comparada con el frame de la imagen anterior, por ejemplo imágenes creadas donde un circulo se mueve hacia la derecha.

Para este laboratorio solamente checo el movimiento de un solo objeto.

Ahora les presento el video.



Y por ejemplo, si llega un momento en que no se mueve, el programa indica que no se esta en movimiento.



Este es el código relevante.


Referencias. 
Animation using image sequence, Tkinter-discuss, Extraido de http://mail.python.org/pipermail/tkinter-discuss/2009-December/002138.html

Proyecto: QTigual

Presentación




Propósito
Actualmente el desarrollo de sistemas en dispositivos móviles es una de las muchas maneras en las cuales nosotros como futuros ingenieros en software podemos utilizar para hacer uso de todas sus capacidades y aprovecharlas para hacer innovadoras ideas y atraer al público en general.

Para el proyecto visión computacional se nos pide realizar un sistema que utilice las técnicas aprendidas durante el semestre, es por eso que estuve trabajando en la combinación de tratamiento de imágenes y los dispositivos móviles para realizar un juego donde el usuario debe dibujar lo más igual posible, una imagen que se le muestra al principio de manera que contra el tiempo, luego de un proceso con la imagen dibujada y la original, realizar filtros para obtener un porcentaje de igualdad de imagenes.

Diseño de software
El software está orientado a diferentes campos, primero que nada tenemos una aplicación móvil desarrollada en el lenguaje de programación Objective-C en donde tenmos diferentes vistas, de manera que tenemos una vista principal en donde se la bienvenida al usuario en el juego y tiene que seleccionar si desea continuar jugando.

Durante 4 segundos aparece una imagen que se carga desde el servidor, luego se pasa a la siguiente vista para que el usuario mediante un canvas pueda capturar el dibujo y después de 10 segundos, esta imagen se mande al servidor donde por medio de una aplicación WEB desarrollada en PHP lo guarde y establesca conexión con el puerto 6699 creado mediante un socket en python, de esta manera, al momento de mandar un mensaje a este socket se crea una conexión independiente mediante un hilo y se empieza a procesar la imágen para dar como regreso un promedio de cuanta cantidad de imagen es igual o semejante a la capturada por el usuario, para esta a su vez responder a la aplicación WEB de PHP y retornar un mensaje por HTTP a la aplicación móvil mediante una alerta.

Descripción textual
El sistema se divide en diferentes partes importantes:

  • La aplicación móvil la cual captura mediante un canvas el dibujo hecho por el usuario para mandarlo a la aplicación WEB.
  • Aplicación WEB en PHP que guarda la captura y hace una llamada al puerto que contiene el procesamiento de los filtros.
  • Socket que hace todas las imagenes de tratamiento para devolver el porcentaje de semejanza con la imagen.


En diagrama anterior podemos ver las etapas por las que pasa el juego, de manera que podamos los procedimientos por lo que pasa y sobre los tratamiento de imagen necesarios para obtener un buen porcentaje de semejanza.

Entre los filtros que es necesario desarrollar son:

  • Cambiamos a grises
  • Agregamos el filtro de la mediana varias veces
  • Sacamos la diferencia 
  • Ponemos un umbral
  • Obtenemos esquinas
  • Obtenemos los bordes con Laplaciana
  • Agregamos BFS
  • Obtenemos figura
  • Dibujamos en dicha figura cada esquina detectada con un elipse
  • Se comprara con el mismo procedimiento la figura hecha por canvas
  • Obtenemos el porcentaje de blancos de la imagen
Imagen de server


Detección de esquinas de imagen de server 

Detección de esquinas de imagen dibujada

Se sobre ponen los círculos más grandes
con los círculos más pequeños y
 sacamos la cantidad de blanco en la imagen,
En este caso, no coincidió con ninguno, por lo tanto
no se tiene semejanza






Librerías utilizadas
En la parte de visión computacional no utilicé ningún recurso para realizar los filtros, todo fue escrito por mi, utilizando solamente la librería de imagenes de Python para poder accesar a cada pixel y aplicar los diferentes filtros.

En la parte web, utilizo los recursos de python para números random, numpy y para crear sockets y en la parte móvil utilizo los recursos necesarios para las interfaces y vistas.


  • Threading
  • PIL
    • Image, 
    • ImageTk, 
    • ImageDraw
  • math 
    • floor,
    • atan, 
    • fabs, 
    • pi, 
    • cos, 
    • sin, 
    • ceil, 
    • sqrt, 
    • degrees, 
    • atan2
  • random 
    • randint
  • time
  • numpy
  • socket



Desempeño
Al ser hecha por mi, el proyecto al principio demoraba mucho para dar una respuesta, este fue en el problema que estuve trabajando durante este tiempo en hacer tiempos de respuesta más pequeñas, por lo que hice de cierta manera que la imágen bajara de tamaño para de esta forma el procesado de los pixeles fuera más rápido y dar un resultado rapidamente.

Las imágenes con las que trabaje al principio eran computacionalmente pesadas, por lo de un tiempo aproximado de 15 segundos de respuesta, lo baje a 10, para luego en la versión entregable del proyecto final, lo tenemos aproximadamente en unos 4-5 segundos.


El tiempo está siendo marcado siempre por el tiempo de vida de la conexión del hilo en python, por lo que podemos ver los resultados cada que se inicia un nuevo juego en el terminal.

Trabajo a futuro
Como trabajo futuro yo creo que sería el hacer mucho menos el tiempo de espera al porcentaje de la similitud para de esta manera poder hacer que el usuario tenga una respuesta más rapida sobre lo que esta jugando y no se aburra de estarlo esperando.

Otro proyecto futuro sería el agregar niveles, agregar dificultades de manera que cada vez sean imágenes más dificiles para su similitud, esto mas o menos se encuentra contemplado en el proyecto ya que como lo dije anteriormente al momento de detectar las esquinas el radio de esta detección cambia y de esta manera podemos hacer que los radios sean más pequeños y aumente la dificultad de similitud.

Y como proyecto de largo plazo también el agregar funcionalidades necesarias para su proyección, por ejemplo el jugar contra enemigos, el compartir en redes sociales, en poner puntaje en el gamecenter, etc...


Este es un video de cómo funciona el juego.


Liga a mi repositorio. aquí.

miércoles, 8 de mayo de 2013

Lab: detección de esquinas

Se nos pide realizar para este laboratorio como parte básica, detectar las esquinas con el método de diferencia de filtro mediano y como parte avanzada, hacer un wire-frame uniendo las esquinas con segmentos de líneas.

El procedimiento que realicé:

  • Cambiamos a grises
  • Agregamos el filtro de la mediana varias veces
  • Sacamos la diferencia 
  • Ponemos un umbral
  • Obtenemos esquinas
  • Obtenemos los bordes con Laplaciana
  • Agregamos BFS
  • Hacemos un corte en cada primera esquina detectada
  • Agregamos otra vez BFS en la imagen cortada
  • Unimos esquinas 
Capturas de pantalla:







Este es el código importante:

jueves, 2 de mayo de 2013

Polígonos


Para esta tarea se nos pide detectar polígonos por medio del método detección de lineas rectas.

Lo que realicé y no está terminado es:
  1. Cambiar a grises
  2. Sacar convolución Laplaciana para sacar bordes
  3. Normalizo la imagen
  4. Binarizo los datos
  5. Sacamos el promedio
  6. Se agrega un umbral
  7. Agregamos BFS para detectar todos los bordes 
  8. Los pintamos de diferentes colores
  9. Sacamos mascara de sobel en X
  10. Sacamos mascara de sobel en Y
  11. Detectamos la pendiente de cada pixel
  12. Calculamos su theta (pendiente) 
  13. Ordenamos valores calculados según su pendiente.
  14. Checamos el cambio de cada theta para detectar los lados
  15. Pintamos cada lado de diferente color.
Les muestro unas capturas de pantalla del procedimiento:







Existe mucho ruido en la imagen y no pude detectar cada lado de los polígonos, por ejemplo en la primera imagen obtuve estos lados.

Donde si tengo 5 figuras, pero los lados no concuerdan.

Código relevante





Eso es lo que tengo :(

jueves, 25 de abril de 2013

Lab: Detección de hoyos

Para este laboratorio se nos pide realizar lineas en donde las intercesiones tengan hoyos, Aquí unas capturas de pantalla.

 




Este es el código.

lunes, 22 de abril de 2013

Tarea 6: Detección de agujeros

Se nos pide para esta tarea que detectemos agujeros con un relleno morado y marcar el centro con un punto amarillo, agregar un ID a cada agujero.

Por lo que primero que nada pongo algunos ejemplos que corrí con mi programa, los resultados no son muy buenos en todos los casos, para detectar los puntos mínimos utilizo como referencia la función de MATLAB peakdet en python aquí.













Este es el código

miércoles, 17 de abril de 2013

Lab: Relleno de elipses/círculos

Se nos pide que del código que detecte elipses y/o círculos

• Identificar cada elipse/círculo individual
• Rellénalo de un color aleatorio
• Sigue marcando su centro con bolita & ID con etiqueta
• Imprime un listado de los áreas de los círculos/elipses
• En porcentaje de la imagen completa

Por lo que para realizar esto, utilicé las mismas funciones que he estado reutilizando durante el curso, para identificar el elipse o círculo lo que se hace es verificar sus radios y comparar que si el radio calculado obtenido es igual para ambos lados (o sea, vertical y horizontal) quiere decir que tenemos un círculo, por el contrario tenemos un elipse.

Estos se rellenan con mi subrutina BFS con un color aleatorio, se marca una bolita en el centro y se identifican para proceder a obtener un listado de los que son círculos y elipses, al igual que su porcentaje en base a la figura completa.

Estas son las capturas del programa.





En donde podemos ver que el programa sabe satisfactoriamente si es un circulo o un elipse al igual que información en base a la imagen en general

A continuación expongo el código modificado.

domingo, 14 de abril de 2013

Tarea 5: Detección de elipses

Para esta tarea se nos piden los siguientes puntos:

  • Detectar elipses marcados con tonos naranja.
  • Marcar el centro con un punto azul
  • Poner una etiqueta ID 
  • Imprimir un listado de los semidiametros perpendiculares y su porcentaje con la diagonal máxima de la imagen

Para realizar esto, se nos pide utilizar el método de la cuerda tangente, es por eso que se hacen los siguientes pasos:
  1. Cambiar a grises
  2. Sacar convolución Laplaciana para sacar bordes
  3. Normalizo la imagen
  4. Binarizo los datos
  5. Sacamos el promedio
  6. Se agrega un umbral
  7. Agregamos BFS para detectar todos los bordes 
  8. Los pintamos de diferentes colores
  9. Sacamos mascara de sobel en X
  10. Sacamos mascara de sobel en Y
  11. Generamos puntos aleatorios para cada borde detectado
  12. Calculamos su theta 
  13. Creamos dos lineas tangenciales a los bordes
  14. Se calcula su punto medio
  15. Realizamos los votos a partir de esa linea hasta al final del borde siguiente
  16. Repetimos varias veces para obtener mejor precisión en el centro
  17. Se calcula los radios en X y en Y
  18. dibujamos un punto entre 0 a 360 grados a partir de los datos obtenidos
  19. Vemos el elipse detectado en un tono anaranjado
Les muestro unas capturas de pantalla del procedimiento








Otros ejemplos:








Este es el código de la función principal, si quieren ver mi repositorio, ahí se encuentra completo.