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?


2 comments:

Clandestina said...

Hola, estoy trabajando con la cmucam3, ya tengo todo el software necesario para trabajar. Me gustaría saber si conoces una forma de mandar un byte al robonova, este byte sería leído e interpretado del robonova desde el "puerto" ERX, el problema es que no se a donde mandarlo desde la cmucam3. Te agradeceria demasiado una sugerencia.

Laura said...

Un aporte estupendo! Estoy preparándolo todo para probar, espero que no se me resista la parte del frame grabber! Un saludo!