Reconocimiento de Colores mediante el uso de la Realidad Aumentada


Dentro del desarrollo del proyecto PVRA (PINTURA VIRTUAL PARA REALIDAD AUMENTADA) se ha desarrollado una aplicación en processing que permite el reconocimiento de colores 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).

El fragmento más resaltante e interesante que se desarrolló en este subsistema es el de transformación de un pixel del modelo RGB al CIElab:

//definimos la clase
//declaramos las variables de la clase
//inicializamos la clase
class transformaColor
{
  float x;
  float y;
  float z;
  //Colores RGB
  float rojo;
  float azul;
  float verde;
  //colores lab
  float l;
  float a;
  float b;
  float cab;
  float hab;
  transformaColor(color pixelColor){//inicializacion
    rojo = red(pixelColor);
    azul =  blue(pixelColor);
    verde = green(pixelColor);
    }
   void rgbAxyz(){
    float rojo1;
    float azul1;
    float verde1;
    //transformando
     rojo1 = rojo/255;
     azul1 = azul/255;
     verde1 = verde/255;
    if(rojo1>0.04045){
          rojo1 = (rojo1+0.055)/1.055;
          rojo1 = pow(rojo1,2.4);
     }
       else{
          rojo1 = rojo1/12.92;
     }
     if(verde1>0.04045){
          verde1 = (verde1+0.055)/1.055;
          verde1 = pow(verde1,2.4);
     }
       else{
          verde1 = verde1/12.92;
     }
          if(azul1>0.04045){
          azul1 = (azul1 + 0.055)/1.055;
          azul1 = pow(azul1,2.4);
     }
     else{
          azul1 = azul1/12.92;
     }
     azul1 *= 100;
     verde1 *= 100;
     rojo1 *= 100;
     //xyz definidos según estándar
     x = rojo1 * 0.4124 + verde1 * 0.3576 + azul1 * 0.1805;
     y = rojo1 * 0.2126 + verde1 * 0.7152 + azul1 * 0.0722;
     z = rojo1 * 0.0193 + verde1 * 0.1192 + azul1 * 0.9505;
  }
  //transformando a CIElab
  void xyzAlab(){
      float x1 = 0.0;
      float y1= 0.0;
      float z1= 0.0;
     x1 = x/95.047;
     y1 = y/100.0;
     z1 = z/108.883;
     if(x1 > 0.008856){
          x1 = pow(x1,1.0/3);
     }
       else{
          x1 = 7.787 * x1 + 16.0/116;
     }
     if(y1>0.008856){
          y1 = pow(y1,1.0/3);
    }
       else{
          y1 = (7.787*y1) + (16.0/116);
     }
     if(z1>0.008856){
          z1 = pow(z1,1.0/3);
    }
       else{
          z1 = 7.787 * z1 + 16.0/116;
   }
     //los valores lab
     l= 116 * y1 -16;
     a= 500*(x1 -y1);
     b= 200*(y1 - z1);
      println ("lab" + l + " " +a+ " " + b);
     //calculo la distancia
     cab = sqrt(sq(a)+sq(b));
   println ("cab" + cab);
    //calculado el {ángulo
    float angle = atan2(bra);
    hub = degrees(angle);
    println ("hab" + hab);
  }
}
    //función para diferenciar colores
    float diferenciaSegun1994 (float[] lab1, float [] lab2){
      float c1,c2,dc,dl,da,dh,db,first,segundos,third;
     c1 = sqrt(lab1[1]*lab1[1]+lab1[2]*lab1[2]);
     c2 = sqrt(lab2[1]*lab2[1]+lab2[2]*lab2[2]);
     dc = c1-c2;
     dl = lab1[0]-lab2[0];
     da = lab1[1]-lab2[1];
     db = lab1[2]-lab2[2];
     dh = sqrt((da*da)+(db*db)-(dc*dc));
     println ("dh" + dh);
     first = dl;
     segundos = dc/(1+0.045*c1);
     println ("segundos" + segundos);
     third = dh/(1+0.015*c1);
     println ("third" + third);
     println("AQUI" + sqrt(first*first+segundos*segundos+third*third));
     return(sqrt(first*first+segundos*segundos+third*third));
}
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.
Aquí el video de Demostración:

Ing. Juan Cadillo

Anuncios

1 comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s