Conexión cmucam3 con un robonova

Un paso muy importante una vez que se tiene una versión decente de la detección de una pelota es montar la camara en el robot. En este caso les presento un minitutorial que nos ha donado Virginia García Román, donde pueden claramente ver cómo deben de conectar los servos y la cámara a su robonova. Considero que este paso es bastante importante y muchos de los foros lo omiten, ya sea porque lo consideran demasiado trivial o simplemente porque se les haya pasado mencionarlo. En fin espero que este tutorial les sirva a muchos. Por falta de equipo tendré que enfocar el blog mas hacia la vision computacional en general que a la cmucam, pero los programas que se subirán seran en C, para así mantener una relación más estrecha con lo que es elaborar programas para una cámara con microcontrolador.

Espero poder publicar ahora sí más seguido,

disculpas y saludos,

moi

Tutorial conexión cmucam3
Este blog sigue funcionando!

No he podido poner nada por haber empezado mis estudios en el area! Pero no duden en preguntar! Con gusto les ayudo o consigo la info con alguien que ya haya pasado por el problema!

saludos
Publicar entrada


moi
¿Cómo seleccionar los pixeles de un objeto con MATLAB?

Hace unos dias recibi un correo de un lector que queria obtener los valores de los pixeles en RGB de la figura que se muestra a la derecha. El planteamiento del problema, si no me equivoco, es el siguiente. Se obtiene este tipo de imagen a traves de un objeto que ejerce una presion sobre una pelicula especial. Las distintas tonalidades de colores que se obtienen expresan diferentes cantidades de presion. La empresa que produce este tipo de peliculas, tiene su tabla de conversion. En fin, para obtener una buena medicion de esta imagen se requiere de un algoritmo que sea capaz de identificar el objeto y de tomar las coordenadas de cada uno de los pixeles que conforman a este objeto, para que el usuario pueda accesar cada uno de ellos y leer los valores o modificar lo que sea necesario, segun el problema que se tenga en las manos.

Pendiente....
En estos dias pongo el archivo M. Por lo pronto aqui cuentan con el contenido del mismo.

Solucion en Matlab


function [row,col]=Density()
ID_RGB=imread('C:\Users\moises\Desktop\6kN.bmp');
ID=ID_RGB;
ID_hsv=rgb2hsv(ID);
height=size(ID,1);
width=size(ID,2);
for r=1:height
for c=1:width

if(ID_hsv(r,c,2)>.05)&&((ID_hsv(r,c,1)>.6)||((ID_hsv(r,c,1)<.1)))
ID(r,c,1)=0;
ID(r,c,2)=0;
ID(r,c,3)=0;
else
ID(r,c,1)=255;
ID(r,c,2)=255;
ID(r,c,3)=255;
end

end
end

image=im2bw(ID,0.5);
[imlabels, numObjects]=bwlabel(image, 8);
graindata=regionprops(imlabels,'basic');
objects=size(graindata,1);

for i=1:objects
if(graindata(i).Area>50000)
label = i;
i=objects;
end
end
[row, col] = find(bwlabel(imlabels)==label);


Saludos,

Moi.

Dudas, quejas, moises.pacheco@gmail.com
¿Qué es el etiquetado?

El etiquetado o labeling es el hecho de nombrar cada una de las áreas de pixeles que se encuentren conectados entre sí en una imagen, ya sea bajo el criterio de vecindad cuatro u ocho. Ahora una vez que se tiene segmentada la imagen, con los colores anaranjados, para la identificación de la pelota es necesario lograr un etiquetado correcto.

Les recomiendo que le echen un vistazo a la siguiente explicación de connected components.

Existe una gran cantidad de algoritmos para establecer un etiquetado adecuado. En la cmucam3 se presenta una dificultad que en una computadora no se establece, esto es el hecho de que el microcontrolador que tiene la cmucam3 tiene una capacidad de almacenamiento muchisimo menor que una computadora. Estas limitaciones se reducen al hecho de que la cmucam3 solo es capaz de analizar linea por linea de una imagen. NO se puede abrir la imagen completa, o tenerla almacenada en memoria. Es necesario establecer un algoritmo que sea capaz de funcionar en una sola corrida, para que asi se este seguro de exprimir toda la información del renglón de pixeles antes de liberarlo.

ATENCION: El 20 de junio publico el algoritmo capaz de etiquetar objetos.

si tienen dudas, ocupan saber que onda con el algoritmo para la cmucam3 mandenme un correo.


Saludos,

Moi
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