Social Icons

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

martes, 14 de mayo de 2013

Reporte de Proyecto

¿ De qué trata el proyecto ?

Primero daré una pequeña introducción al proyecto. Es un programa da ordenes a un drone para que se establesca dentro de la imagen de una camara, esto se puede realizar analizando la imagen tomada de la camara e identificando la posición del drone esto con el fin de identificar en que parte del area de la imagen se encuentra el drone y a partir de ahí decirle al drone que movimiento realizar para llegar al centro de la imagen la cual es nuestro caso ideal (estar en el centro de la imagen).

 ¿ Cuál es el propósito del proyecto ?

El propósito principal del proyecto es poder hacer un proyecto génerico para que se puedan realizar proyectos en donde el drone pueda realizar alguna cooperación con algún otro robot en la superficie, realizar alguna busqueda en la superficie ó seguir algún objetivo.

¿ Cuál es el diseño del software?

El software actualmente se compone de las siguientes partes:


¿ Qué librerías se utilizaron ?

Las librerías utilizadas son las siguientes:

   PIL >= versión 1.1.7
   Tkinter >= versión 8.5
   Numpy >= versión 1.7.0

Dichas librerías fueron usadas con Python versión 2.7.

Descripción de los procedimientos en el proyecto

Primero obtenemos una imagen del drone, una vez obtenida la imagen del drone (como la imagen de abajo).



Después realizamos una convolución para realizar la detección de bordes usando las máscaras de Prewitt, una vez obtenida la convolución se realiza una binarización de la imagen.


Después de realizar la binarización lo que pasaremos a hacer será la detección de objetos utilizando el BFS (Breadth First Search), se crean 3 grupos de objetos (cada color es un objeto); drone, fondo y ruido, esto se hace obteniendo el primer objeto con mayor cantidad de pixeles el cual llamaremos fondo, luego obtenemos el segundo mayor objeto con mayor cantidad de pixeles como drone y por último todos los demás pixeles que queden fuera de este grupo se denominan ruido.


Luego de obtener los 3 grupos pasaremos a clasificar el ruido a partir de que vecino se encuentre dentro del ruido, por ejemplo si una coordenada obtenida dentro del grupo de Ruido tiene más vecinos de fondo entonces dicha coordenada se clasifica como Fondo en caso contrario será clasificado como Drone.


 Ahora solamente tendremos el grupo de Fondo y Drone. En el grupo de Drone lo que buscaremos serán los ejes x y y mínimos y máximos, esto con el fin de obtener las dimensiones del Drone así como el centro de masa del Drone.


Obtenemos el centro de la imagen y obtenemos la diferencia del centro del drone y la imagen. Dicha diferencia nos ayudará a definir en que area se encuentra por las siguientes reglas:

Primero se tiene el centro de la imagen a partir del centro de la imagen se tiene una cierta tolerancia hacia el eje positivo del eje x se tienen brincos de 10 %, 30% y 50% al igual que en el eje negativo de x, esto también sucede en el eje y que tiene brincos de 15% y 45% en su eje negativo y positivo, y cada tolerancia en el eje x se tiene dividido en 5 partes y en el eje y dividido en 3 partes.

  • Usaremos el eje x para determinar si el drone debería irse hacía la izquierda ó derecha. Si la diferencia del drone y la imagen es mayor en valor absoluto a 10% en el eje negativo de x significa que el drone se encuentra en la izquierda de la imagen y debe irse hacía la derecha, en caso de que se encuentre a la derecha tendrá un valor positivo mayor al valor 10% del ancho de la imagen deberá hacerse hacia la izquierda ya que se encuentra el drone en la derecha. En caso encontrarse dentro del 10% del valor absoluto del ancho de la imagen significa que esta en el centro.
  • Usaremos el eje y para determinar si el drone debería irse hacía abajo ó arriba. Si la diferencia del drone y la imagen es mayor en valor absoluto a 15% en el eje negativo de y significa que el drone se encuentra en la parte de abajo de la imagen y deber irse hacía arriba en caso de que sea en el eje y positivo debería irse hacía abajo. En caso de encontrarse dentro del 15% del valor absoluto de la altura de la imagen significa que esta en el centro.
  • Usaremos las dimensiones del drone para determinar si se acerca o aleja, teniendo como límites que tenga un tercío de la imagen como mínimo en su tamaño normal y como máximo la mitad de la imagen como su tamaño máximo, si sale del límite máximo debería alejarse y si sale del tamaño normal debería acercarse.

Trabajo a futuro

  • Aplicación de velocidades del drone saber la velocidad de movimiento.
  • Existe cierto problema al momento que el drone se encuentra parcialmente visto dentro de la imagen, ya que este lo detecta como si se estuviera alejando y pide que se acerque el drone (como podrán ver en la imagen de abajo).

GitHub

Enlace directo al branch master del proyecto.
https://github.com/SaulG/proyectoVision/tree/master

lunes, 15 de abril de 2013

Tarea 5: Detección de elipses

En esta tarea se trabajo para hacer la detección de elipses, aunque realmente se tuvieron unos problemas en el procedimiento. Los pasos principales que se realizaron fueron los siguientes:

  1. Hacer detección de borde.
  2. Elegir pares antiparalelos.
  3. Generar votos a tomando como frontera el borde y las rectas de pares antiparalelos.
  4. Determinar a partir de porcentaje de votos sí realmente es un elipse (Por agregar).
Lo primero es necesario para saber en que area vamos a trabajar, después de saber el area en la que trabajamos, se empiezan a tomar pares de puntos aleatorios para luego sacar su punto medio y tomarlo como voto. A partir del porcentaje de votos se podrá determinar sí es un elipse.

Ahora lo que se implementó, tuve grandes problemas donde dichos problemas eran de herencia de tareas anteriores con los indices en donde estaban en algunos invertidos en otros no. En fin lo que se implementaron solamente fue la realización de los votos y la creación de las rectas antiparalelas con puntos aleatorios seleccionados. Esto fue lo que obtuve.

 


martes, 5 de marzo de 2013

Detección de círculos

En esta entrada mostraré lo que se hizo para hacer la detección de círculos. Primero obtenemos los gradientes en el eje x y en el eje y y se le calcula el seno del eje y entre el gradiente, de igual forma sucede con el coseno pero con el eje x, y para cada coordenada x y y se le resta el radio dado por el seno para y y por coseno para x. Después podemos obtener el círculo. Ahora mostraré unos ejemplos parciales que no pude completar, pero aspiran a mejorarse en el laboratorio de visión computacional.

Donde detecta parte del círculo y dado un radio  de 0.001 (de color verde).

Ahora cuando incremento el tamaño no me lo detecta, doy un radio de 20 (tomando en cuenta que sí es cierto que tomaría como radio pixeles).

Este es el código relevante:


lunes, 25 de febrero de 2013

Tarea 3: Detección de líneas

Para realizar la detección de línea se tomo como base la tarea para la detección de bordes, en donde se obtenía los gradientes en el eje x y y. Usando la función  obtenemos theta y teniendo theta podemos resolver ,  dichos valores obtenidos por cada punto(x, y) se guardan en un diccionario y por cada vez que ocurre theta y rho se le agrega un contador para determinar cuales tienen lineas continuas, cuando tienen un gran voto significa que existe una línea continua. Para demostrarlo primero mostraré algunas imagenes en donde se detectan las líneas con su muestra original.

Imagen original.

Imagen con filtro de detección de líneas.

Imagen original

En este ejemplo tengo algunos errores pero puede detectar algunas líneas horizontales. Imagen filtrada.

Imagen original

En este ejemplo tuve problemas ya que el fondo lo tomaba como dominante y cambiaba el color a rojo, claro esta que esto puede ser alterado manualmente pero la solución que se busca es tratar de evitar eso. Imagen filtrada.

Imagen original.

Imagen filtrada.

Código:

lunes, 18 de febrero de 2013

Tarea 2: Detección de líneas

Esta entrada trata sobre detección de líneas usando un algoritmo de BFS (Breath First Search) es un algoritmo para recorrer grafos (nuestra imágen), el cual recorre un color en específico de cada pixel, hasta visitar todos los vecinos (en donde cada vecino tiene que ser del mismo color). Para realizar esta tarea se tuvo que haber obtenido un filtro de binarizacion para poder extraer varios objetos. A continuación veremos unos ejemplos, donde primero se muestra la imágen original y la imágen filtrada con la binarizada.





Código:

jueves, 14 de febrero de 2013

Tarea #2 de laboratorio: Efecto Sal y Pimienta

El tema sobre esta tarea es el efecto de sal y pimienta, esto refiere a que se aplican tonos negros y blancos de manera aleatoria y esto genera un efecto de sal y pimienta. Se crearon dos funciones, uno para crear el efecto sal pimienta en imágenes y otro para removerlo. A continuación veremos unos ejemplos del efecto de sal y pimienta.




Una vez visto estos ejemplos vamos a explicar como se elimina el efecto de sal y pimienta, la idea es fácil simplemente se visita cada pixel, se hace un promedio de sus vecinos y si este es diferente se coloca el promedio, si no este se deja igual. A continuación veremos el código (el código viene comentado y explica como funciona).


Y ahora veamos algunas imagenes usando el programa mostrado arriba.

Estas imagenes fueron usadas con estos parámetros: imágen, densidad de pimienta y iteraciones de limpieza







lunes, 11 de febrero de 2013

Tarea 1: Detección de bordes

Para la detección de bordes se tuvieron que determinar gradientes locales de intensidad dentro de máscaras de convolucion, en donde se encuentran una gran variedad de técnicas dominantes. Para realizar esta tarea se optó por la técnica de Gradiente diferencial (DG); donde se encuentra una gran variedad de máscaras para hacer la detección de bordes con la técnica de DG. Estos son unos cuantos.

A continuación veremos en código la técnica de DG usando la máscara de Prewitt.



El código corre de esta manera, tomando como parametro el nombre de la imagen.


Al terminar nos dará el tiempo que tardó en hacer todo el proceso.


Ahora vemos distintas imagenes aplicando la convolucion, para después hacer una binarización a la misma, para así facilitarnos la detección de bordes.

Imagen original


Imagen con máscara y con binarización


Imagen original


Imagen con máscara y binarizacion


Imagen original



Imagen con máscara y binarizacion



Fuente de las imagenes:

http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/bordes.pdf