lunes, 25 de octubre de 2010

Recogiendo umbrales

Como en el mundo real las cosas son variables lo que estoy haciendo ahora es recoger los umbrales entre los que está cada color.

Para ello hago varios pasos:

Paso 1:
Hago una resta de la imagen actual con el fondo (el fondo ahora es una imagen que he tomado, porque trabajo en el semi mundo, pero luego será el primer frame que se coja de la cámara). Con esta operación lo que consigo es crear una máscara donde los píxeles que han cambiado serán los que tengan mi objeto a buscar.

Paso 2:
Consultando en la máscara, miro en los píxeles que son diferentes los valores que hay en cada canal. Tengo unos umbrales muy genéricos para reconocer cada color, con esta operación lo que hago es ajustar esos umbrales al momento.

Paso 3:
Aplico el umbralizado del color que quiero con los umbrales que he obtenido previamente.


Y con esto, tan bonito y sencillo, consigo hacer la calibración para cada color. Lo siguiente que hay que hacer es juntar esta calibración con el filtro de partículas. Un trabajo de chinos, pero se hará lo que se pueda.

jueves, 21 de octubre de 2010

Acercándose a la realidad

Durante todo este tiempo he estado trabajando con "un mundo ideal", donde las cosas a seguir eran cuadratitos perfectos, con su color bien definido. Es hora de enfrentarse a la realidad, pero no mucho porque da miedito aun.

Así que me he creado un mundo semi-ideal. Ahora mismo en lo que estoy trabajando es en recoger en el vídeo los parámetros que tendrá cada color que voy a seguir. Cuando todo esté bien montado tendré un dedal de cada color, pero hasta entonces tengo que coger lo que encuentro más a mano que son mis bolis de colores (y muchos me llamaron loca cuando los compré, juas).



Como se puede observar cada la tapa de cada boli es del color que quiero que sean los dedales. Y como estoy en un cuasi mundo real voy a trabajar con un fondo fijo.

La primera parte es dividir la pantalla en cuatro zonas diferentes que será donde reconoceré cada uno de los colores.



Y una vez que tengo esas zonas en cada uno de los cuadrados tengo que poner el color que quiero buscar.







Pues con esto tengo ya preparado mi mundo para poder hacer la nueva funcionalidad, pero como ya he dicho que es un cuasi mundo ahora vuelvo trabajar con imágenes fijas para sacar cada color, porque hay que ir pasito a pasito, luego ya cuando tenga el calor suficiente (y el algoritmo funcional) aplicaré el reconocimiento de los colores sobre el vídeo.

Y ya como último paso será atreverme a quitar el fondo, pero para eso aun queda mucho código entre medias.

miércoles, 20 de octubre de 2010

Arreglado

Para solucionar el error de ayer se ha tenido que desinstalar el opencv 2.1 y poner la versión 2.0, después se han instalado los drivers de la cámara, y usado la cámara:




Porque es la única (de las que tenemos) que acepta el formato de entrada en opencv.

Y por último poner cvWaitKey(2);


Con esto ya podemos acceder a la webcam, así que ahora toca trabajar con la imagen que se recoge.

martes, 19 de octubre de 2010

Problemas

Llegados a este punto he descubierto que tengo un problema.

He conectado una webcam y he hecho un programilla simple que lo único que hace es visualizar en una pantalla lo que captura la webcam. Como don Murphy está presente cuando menos lo requieres me ha salido el siguiente error:

HIGHGUI ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV


Así que hay que buscar una solución para ello, ¿cuál? Pues la más sencilla es volver a la versión anterior de opencv, la 2.0, que se sabe que no da problemas.

Video del filtro

Antes de poner el vídeo pongo una captura de los diferentes umbralizados que tengo. En la primera imagen se observan dónde se encuentra cada uno de los objetos. En la imagen de abajo están los diferentes umbralizados que se hace a cada objeto de cada color. Como se puede ver solo se encuentra en blanco los píxeles que nos han interesado de cada uno.





Y para ver que esto realmente funciona dejo el seguimiento de los objetos durante todo el vídeo.

Filtro conseguido

El último paso que he tenido que realizar es juntar todo.

Una de las cosas que he tenido que añadir es que si en algún momento no se encuentra ninguna partícula con peso hay que volver a lanzar de forma aleatoria las partículas. Esto en el vídeo que me he creado no es muy útil ya que no desaparecen los elementos a seguir, pero en lo que voy a necesitar si pasará que desaparezca algún elemento y por lo tanto tenga que reiniciarlo de nuevo.

Otra de las cosas que he tenido que cambiar son los umbrales para hacer la umbralización, pues antes estaba trabajando en un mundo perfecto y por lo tanto los colores estaban bien definidos. Por ejemplo tenía que para el rojo necesitaba que el canal de rojo estuviera en 255 y el verde y el azul en cero ambos, así que he tenido que darle un poco más de margen, para el rojo entre 240 y 255 y para los otros dos que sean menos de 10. Los mismos cambios he hecho para el umbralizado en verde, azul y amarillo. Y con este último cambio ya se puede ver cómo funciona el filtro.

Dejo constancia que esto funciona con unas capturas de pantalla, primero de cada uno de los colores por separado y finalmente todo junto. Como se ve en la imagen el cuadrado consigue encontrar cada elemento perfectamente.












Y como estas cosas quedan mucho más bonitas cuando se ve cómo lo va haciendo por todo el vídeo ahora voy a aprender a grabar vídeo con opencv, para poder compartir con el mundo mi gran trabajo, juas.

viernes, 15 de octubre de 2010

Creando un vídeo personal

Como tengo que trabajar en mi mundo abstracto lo siguiente que he hecho ha sido crearme un vídeo adaptado para mi caso.

Para ello hemos usado el programa videosyn, al cual hay que ponerle el tamaño de la imagen del vídeo, los frames que tiene y los objetos. Luego a cada objeto se le define la altura, anchura, color y recorrido que realiza.

Como me interesa me he creado cuatro objetos, cada uno de ellos de un color (rojo, azul, verde y amarillo), y luego les he puesto a moverse por ahí por la pantalla.

El resultado es este vídeo:



Ahora me dedicaré a toquetearlo para encontrar dónde está cada uno de los cuadrados y a seguirlo.