Realiza la segmentación en casa con tu cmucam3

Si eres de las personas que no les gusta estar encerrados en cubiculos, pero aun asi quieres trabajar, o realizar proyectos en casa, entonces te conviene leer esta sección. Para poder trabajar en la casa necesitaba bloquear la iluminación ambiental. El sol me agrada pero no me deja trabajar y en las noches la luz artificial también afecta mis imagenes. Como no quería gastar dinero en material de apoyo, tomé los deshechos de carton de cajas de cereal, galletas saladas, dulces y demas para poder hacer una caja en la que no me afectara la luz del ambiente y pudiera realizar los avances en la detección del balón. Como iluminacion utilice una lamparita de lectura. La lampara trabaja con un led blanco y MUY importante, una prenda de ropa sucia paracubrir un lado de la caja (Poner imagenes de la caja y herramientas.)

Al terminar de construir la caja le hice un orificio para colocar la cámara en la superficie superior, para que asi pudiera tener un acceso rapido a ella, ya sea para quemar los programas, bajarlos, analizar las imagenes de la tarjeta SD.

Vayamos a lo interesante.
Si ustedes quieren probar el tipo de iluminación y ver las imágenes que la cámara esta tomando en el momento, lo que pueden hacer es bajar el Frame Grabber de la cmucam y dentro de los programas que contiene el cc3 viene uno que es el cmucam2 carguen el archivo hexadecimal a su cámara y con él podran tomar imágenes por medio del programa Frame Grabber. Para utilizar el programa es sencillo, simplemente conecten su camara por el puerto serial. Enciendan la camara y presionen en la aplicacion el boton de connect. Al hacer esto se establece la coneccion con la cmucam y al presionar Grab Image, tomará una imagen y la desplegará en su pantalla. Así de sencillo.

Ahora digamos que se tiene una imagen como la de la izquierda. Esta imagen la tome con la cmucam3 adentro de la caja improvisada y con la iluminacion de la lampara roja. No es perfecta pero es lo suficientemente buena para empezar a trabajar. El objeto anaranjado es un pedazo de tela vieja. Es importante utilizar objetos opacos ya que en otros casos el reflejo de la luz puede dar resultados no deseados. Bueno, ya tenemos esta imagen. Ahora qué, cómo detectamos los colores. En un post les expliqué un poco sobre el procedimiento. Primero se tiene que pasar de rgb a hsv (Véase Jueves 28/08/2008). Pero ojo, no se tiene que transformar la imagen, simplemente obtener el valor equivalente, no es necesario cambiar el formato. Abran de su folder cc3 el archivo main.c ubicado en: cc3/projects/hsv-ppm-grab/main.c. En el renglón 95 comienza la función capture_ppm que recibe como parámetro un apuntador de tipo FILE, que apunta al espacio de memoria en donde se grabará la imagen.

Explicación breve de la función.
Renglones:
97-101: Se declaran variables del tipo indicado.
103: llama la funcion cc3_pixbuf_load(); aquí se carga la imagen de la cámara, en otras palabras toma una foto.
104: malloc separa un espacio de memoria y almacena un renglón de la imagen.
106-107 Toma los valores de ancho y alto de la imagen y los almacena en las variables size_x y size_y.
109 imprime en un archivo ppm el encabezado para comenzar a escribir los pixeles que conformarian la imagen.
111 simplemente toma el tiempo que tarda en grabar la imagen.
112-123 Entra en un ciclo donde recorre renglon por renglon y pixel por pixel cada renglon para grabar la imagen en formato ppm.
124 toma el tiempo en que acaba
125 hace una resta de tiempo final menos tiempo inicial.
127 libera el espacio de memoria.
129-131 imprime el tiempo que tardó.

Ahora incluye la clase hsv.h en tu archivo con el codigo #include agrega la clase cc3_hsv.h en el inicio de tu archivo. Al incluir la clase cerciorate de que el Make file dentro del folder ppm_grab incluya algo similar a lo siguiente:

PROJECT = ppm-grab

CSOURCES = main.c

INCLUDES =

LIBS = cc3-ilp


include ../../include/common.mk


Al tener esto no tendras problemas para compilar. Compila por medio de cygwin. Despues regresa a tu archivo main.c en el renglón 114 agrega el siguiente código: cc3_rgb2hsv_row(row);

Ahora abre C:\cc3\lib\cc3-ilp\hsv.c y dirigete a la funcion cc3_rgb2hsv. Esta funcion es la que nos va a hacer el cambio de color en los pixeles. Ahorita lo que hace es simplemente cambiar de rgb a hsv el valor de un pixel y como nosotros queremos el valor equivalente del pixel rgb en hsv sin cambiar el contenido del pixel entonces, nos dirigimos al final del codigo. Elimina los renglones 88-90.

pix->channel[CC3_CHANNEL_HUE] = hue;
pix->channel[CC3_CHANNEL_SAT] = sat;
pix->channel[CC3_CHANNEL_VAL] = val;

ahora con esta informacion que tienes del hue, sat y val puedes establecer tus rangos. Determina los valores maximos y minimos de cada una de las variables lo puedes sacar facil
mente de las ecuaciones que te dan. Toma en cuenta que los valores de las componentes NO van del 0 al 255, sino del 16 al 240, es decir que un pixel 240, 0, 0 establece un rojo vivo.
Una vez que tengas los máximos y los mínimos puedes establecer los rangos de colores basandote primordialmente en el hue.
Pueden visitar YaflaColor para darse una idea de cómo
funciona el hsv.

Les muestro dos imágenes que obtuve de mi playera anaranjada y de la pelota anaranjada. La primera la tome en la caja negra y la segunda en el piso de la biblioteca de la universidad. El piso es de una tonalidad amarilloverdosa y por lo mismo cae dentro de mi rango de amarillos. No se espanten por el ruido que lleguen a obtener en sus primeras imágenes solamente tienen que ajustar bien sus rangos de hue, sat y val. También ayuda mucho tener una iluminacion controlada como la de una biblioteca donde no interfiere la luz del sol y las lámparas iluminan todo de una forma casi homogenea.

Les deseo suerte en su implementación y cualquier duda que tengan no teman en preguntarme.

Saludos!

Próxima entrada: ¿Qué es el etiquetado?


¿Qué es segmentar una imagen?

Definición (inglés).

En términos generales, la segmentación de una imagen es la partición de la misma en grupos de pixeles. En esta seccion nos vamos a enfocar en la segmentacion con el proposito de analizar una imagen y localizar un color determinado. En este caso sera el color anaranjado por el simple hecho que es el color del balon de fútbol de la robocopa humanoides categoría kid.

En cualquier tipo de procesamiento de imágenes una iluminación controlada es una herramienta igual de fuerte que cualquier algoritmo que se considere implementar. Otro aspecto importante es tener en cuenta que la iluminación cambia el reflejo de los colores. Esto último puede parecer bastante trivial, pero para una camara sencilla la iluminación de un foco común y corriente puede llegar a teñir la imagen de tonos amarillos o anaranjados. Por el contrario si se trabaja con una imagen en escala de grises la iluminación mas asertada es la roja.

En resumen:
Si se trabaja con una imagen a color se requiere de iluminación blanca.
Si se trabaja con imagenes en escala de grises se requiere de iluminación roja.



Aquí les paso las reglas para la Robocopa 2009 en Graz, Austria. Dato curioso: Tierra natal de Arnold Schwarzenegger. Las reglas las liberaron hace un par de semanas y esta versión es la definitiva. Pueden compararlo con el archivo que les subi el año pasado para que vean con detalle las diferencias que se presentan.

Reglas:
Robocup Soccer Humanoid League Rules 2009 With Changes Marked
Robocup Soccre Humanoid League Rules 2009
Modifiqué el post del 18/07/2008 titulado: Tutorial cmucam3 para WinXP. Le agregué un manual de instalación y uso del LPC210x y el día de mañana quedará listo el manual de instalación del arm gcc para todos aquellos que tengan duda.

Saludos,

Moises Pacheco Gendrop.