Blog que narra la experiencia en la construcción y uso de conceptos de la Realidad Aumentada para favorecer el desarrollo kinestésico y reconocimiento de colores con niños

Entradas etiquetadas como ‘opencv’

Subsistema de Reflejos y Lateralidad para el Proyecto PVRA

Para consolidar el desarrollo, se buscó  reforzar el aspecto kinestésico, lo que permitiera que los niños refuercen sus reflejos y lateralidad mediante la aplicación de juegos; a ello apunto el desarrollo del módulo de ping pong, el módulo de Lateralidadque reforzará el reconocimiento de DERECHA, IZQUIERDA, ARRIBA Y ABAJO. Se implementó un probador de ropa que permite coordinar todo lo aprendido. Y finalmente me anime a desarrollar un piano virtual que sería una adaptación del probador virtual pero en vez de mover o cambiar la ropa se debe tocar una nota musical.

El módulo de ping pong se basa en el reconocimiento y seguimiento de color COLOR TRAKING, que permite mover las barras de los jugadores según un color definido por click (PRIMER JUGADOR ) y anticlik (SEGUNDO JUGADOR). Una pelota se mueve de izquierda a derecha y viceversa donde el jugador tiene que impedir que la bola pase hacia el final de su campo, para ello tiene una barra que se desplaza verticalmente. El juego requiere de coordinación, equilibrio y fuerza en el brazo para mantenerlo levantado.

Para indicar que se está dando el movimiento de las barras y su dirección se ha colocado unos círculos pequeños de diferentes colores que le indican al jugador el sentido que tiene su movimiento.

Fig. Ping Pong – con seguimiento de color (color traking) probado por los

niños del 4º

A continuación se muestra el segmento de código para la implementación de la paleta de juego:

class paleta { //gestor de movimiento, según color

Point e1, e2;

paleta(){ //declaración de la clase

e1 = new Point( 0, 0 );

e2 = new Point( 0, 0 );

}

void mover(){

//nueva región de interés

if (s1)

{

//e1.x = constrain(e1.x, 40, width – 40);

e1.y =  constrain(e1.y, 0, height); //región limite

mouseYnuevoI = e1.y;

ellipseMode(CENTER);

ellipse( e1.x, e1.y, 30, 30 );

}

if (s2)

{

e2.y =  constrain(e2.y, 0, height); //región limite

mouseYnuevoD = e2.y;

fill( 0, 255, 255, 128 );

ellipseMode(CENTER);

ellipse( e2.x, e2.y, 30, 30 );

}

}

El módulo de Lateralidad permite distinguir la dirección del movimiento; si es a la izquierda, a la derecha arriba o hacia abajo.

 

Fig. Juego de Lateralidad: Izquierda, Derecha, Arriba y Abajo

Presentamos una declaración de variables usado:

//Programa que mueve la burbuja en cualquiera de las cuatro direcciones

import hypermedia.video.*;          //  Importando OpenCV library

OpenCV opencv;                      //  Creando un Nuevo objeto OpenCV object

PImage movementImg;                 //  Creando un PImage para detector movimiento

PImage bubblePNG;                   //  Crea un PImage para la burbuja a mover

PFont font;                         //  Crea un objeto font

Bubble bolita;

El módulo  probador virtual permite que el alumno demuestre sus destrezas de coordinación y ubicación para poder  elegir un polo que se le acomode al cuerpo, para ello utiliza el sistema de menú con detección de movimiento.

A continuación presentamos una imagen ilustrativa y el código correspondiente a la clase que permite el cambio de color, tamaño y ubicación de la ropa.

Fig. Probador Virtual – con menú interactivo

class Ropa

{

int rX, rY, ropaWidth, ropaHeight;

int MaxropaWidth, MaxropaHeight;

int elcolor;

Ropa ( int rpX, int rpY, int rW, int rH, int posicion)

{

rX = rpX;

rY = rpY;

ropaWidth = rW;

MaxropaWidth = rW;

ropaHeight = rH;

MaxropaHeight = rH;

elcolor = posicion;

}

}

Y el Piano virtual, es cual todavía nos falta perfeccionar.

Presentación de los Resultados:

Video 1: Institución Educativa  “Jesús Nazareno”

Video 2. Institución Educativa “Jesús Nazareno”

Video3. Institución Educativa  “Jesús Nazareno”

Video 4. Institución Educativa

Juan Cadillo

Subsistema de Dibujo Kinestésico para el Proyecto PVRA

Este es el subsistema  que demando mayor  trabajado. Partimos de la capacidad de poder detectar movimiento para lo cual usamos las librerías para JAVA de OpenCV ubicadas en OPENCV Processing and Java Library cuya dirección url es: http://ubaa.net/shared/processing/opencv/.

Para ello dividí el trabajo en:

  1. Poder detectar el movimiento en regiones puntuales, lo que sirvió para localizar los menús que funcionarán sin necesidad de presionar el mouse o alguna tecla.

 Menú de selección de color activado por detección de movimiento

Fig. Menú de selección de color activado por detección de movimiento

Se trabaja básicamente sobre una diferencia de pixeles de un imagen capturada frente a otra imagen capturada posteriormente; si la diferencia es marcada en la región entonces se ha detectado movimiento; lo que corresponde a la selección de un color para el pincel que debe pintar en nuestro caso.

También se prevé que se tenga que borrar el lienzo donde se pinta lo que se hace con el menú borrar.

 

Fig. Menú de borrado de lienzo – activado por detección de movimiento

El código que presentamos a continuación permite poner una imagen en escala de blanco y negro y hace uso de las librerías de openCV:

  // luego de encontrado el color aplicamos filtros para detectar movimiento

  opencv.absDiff();                           //  Crear una diferencia de imagen

  opencv.convert(OpenCV.GRAY);                //  Convertir a una escala de grises

  opencv.blur(OpenCV.BLUR, 3);                //  Remover- ruido

   opencv.threshold(20); // Thresholds to convert to black and white; se puede //seleccionar en función de la luz del ambiente.

  1. Poder pintar sobre el lienzo (pantalla), para ello en primer lugar se trató de detectar bloques de objetos con la función blobs()  de OpenCV pero no fue muy efectivo ya que se detectaban mucho bloques (regiones agrupadas) y el pincel corría de un lugar a otro imposibilitando dibujos uniformes; por lo se vio por conveniente cambiar a un reconocimiento de color, aprovechando lo aprendido en el subsistema de reconocimiento de color. La idea guía fue presentar una imagen de un solo color, sacar el promedio de color dentro de la imagen capturada por el video y en base a este promedio guiar al pincel; en inglés a esta técnica se le denomina “color Tracking”. El inconveniente de este método es la cantidad de otras imágenes que puedan tener un color similar al que estamos siguiendo; esto hace que el pincel salte de un lugar a otro en algunas ocasiones. O en algunos casos la pérdida del color de seguimiento debido a la variación de luz que hace que un objeto se vea de un color distinto al del seguimiento. Una solución al caso planteado es combinar el reconocimiento de bloques y el reconocimiento de color; para ellos se tendría que implementar una red neuronal o algún tipo de filtro como el de Kalman;  pero cuya programación es más costosa.

Fig. Pincel activo – seguimiento de color (color traking)

A continuación se presenta el código que permite implementar el color tracking en el subsistema:

////sacar el promedio de los puntos de un color

Point avg( ArrayList l ) {

int  posicionY = 0;

if (l.size() == 0) {

return new Point( 0, 0 );

}

int x = 0;

int y = 0;

boolean cont = true;

for( Iterator i = l.iterator(); i.hasNext(); ) {

Point p = (Point)i.next();

x += p.x;

y += p.y;

if (cont)

{

posicionY = p.y;

cont = false;

}

}

if (( posicionY – y / l.size())< 20)

{

return new Point( x  / l.size(), y / l.size() + 50);

} else

{

return new Point( x  / l.size(), y / l.size());

}

}

Video 1. Institución Educativa “Jesús Nazareno”

Para poder dibujar es necesario seleccionar un color haciendo click sobre él; los niños del cuarto grado se concentraron mucho en esta actividad para apoyar a los niños pequeños.

Juan Cadillo

Subsistema de reconocimiento de color del proyecto PVRA

Para el subsistema de reconocimiento de color, se tomó  como base  el libro “Learning Processing A Beginner’s Guide to Programming Images, Animation, and Interaction” de Daniel Shiffman quién propone un algoritmo de selección de color y su seguimiento del mismo en el video; el algoritmo fue adaptado para usarse con openCV. Si bien podemos seguir el color mediante la comparación de pixeles nos quedó el problema de poder identificar el color exacto; esto debido a las diferentes tonalidades que distingue el ojo humano; el modelo RGB (rojo, verde y azul) usado por los programas de diseño no  fue  eficiente para poder reconocer adecuadamente los colores debido a las variaciones de luz e intensidad a la hora de reconocer  los colores básicos, por lo que se tuvo que recurrir a una transformación del RGB al modelo CIElab, en el que se mejoró los resultados; pero sigue existiendo problemas con la cantidad de luz a la que es expone el objeto (ambiente oscuro o ambiente con demasiada luz).

Para reforzar el reconocimiento de colores, el niño o niña que selecciona un color en el espacio (aula) podrá distinguir un elipse que se desplaza a través de la pantalla ubicándose en objetos cuyo color es similar al seleccionado con el mouse. En caso de ser un color básico: ROJO, AMARILLO O AZUL (Concepto tradicional sobre los colores básicos), o VERDE, NEGRO O BLANCO se le mostrará un video que muestre objetos y su respectivo nombre del mismo color seleccionado.

Los resultados se muestra a continuación:

Video 1. “Institución Educativa Jesús Nazareno”

Video 2. “Institución Educativa Jesús Nazareno”

Juan Cadillo