miércoles, 4 de julio de 2012

máquina de juicios estéticos

La idea es construir un simple animatrónico que sonría o muestre un gesto de disgusto dependiendo si la imagen ante él le parezca 'arte' o no, según su gusto. Para lograr esto se utilizarían descriptores que analicen la imagen y 'reconozcan' si lo que tiene el animatrónico ante sí es arte o no. En una primera instancia se trabajará con reconocimiento de rostro para emitir juicios sobre los diferentes rostros que puedan estar frente al animatrónico.

Primero que todo se debe analizar imágenes para tratar de determinar alguna diferencia entre lo 'bello' y lo 'feo'.

FaceDetect

Datos

Img # de Piexeles R G B Grises
beau 18305,26 165,03 156,51 150,52 157,35
boni 13692,52 166,88 154,22 142,13 154,41
fe 14928,08 141,24 138,04 135,85 138,38
ug 14793,62 167,98 157,55 147,37 157,63


A partir de estos datos se toma una decisión, al fin y al cabo la decisión (como todas las decisiones de gusto) es arbitraria, evidentemente se hace a partir de los datos extraídos de fuentes externas, pero arbitrarias al fin.

El código:

    import codeanticode.gsvideo.*;
import pFaceDetect.*;


GSMovie cam;
PFaceDetect face;
PImage img;
PImage cara;

PrintWriter output;

color ca;
float ra, ga, ba;
color cp;
int t;
float subtotalr, subtotalg, subtotalb, totalr, totalg, totalb;
float promedior, promediog, promediob, promgris;

void setup () {

  size (320, 240);
  background (0);

  output = createWriter("valores.txt");

  cam = new GSMovie (this, "beautiful_.avi");
  //cam.loop();
  cam.play();
  while (!cam.available ()) {
    cam.read();
  }
  face = new PFaceDetect (this, width, height,
  "haarcascade_frontalface_default.xml");

  //cam.play();

  img = createImage(width, height, RGB);

  rectMode(CORNER);
  noFill();
  stroke(255, 0, 0);
  smooth();
  //noLoop();
}

void draw () {

  if (cam.available() == true) {

    cam.read();


    image (cam, 0, 0, width, height);
    face.findFaces (cam);

    drawFace();
  }

  t++;
  //println(t);
  if (t==340) {
    output.flush();
    output.close();
    exit();
  }
}


void drawFace() {


  int [][] res = face.getFaces();
  if (res.length>0) {
    for (int i=0;i<res.length;i++) {
      int x = res[i][0];
      int y = res[i][1];
      int w = res[i][2];
      int h = res[i][3];
      rect(x, y, w, h);
      int bx = x+w;
      int by = y+h;
      cara = createImage(w, h, RGB);
      //cam.loadPixels();
      //cara.loadPixels();
      int p=0;
      float[] sumar = new float [w*h];
      float[] sumag = new float [w*h];
      float[] sumab = new float [w*h];
      for (int b=y;b<by;b++) {
        for (int a=x;a<bx;a++) {
          cam.loadPixels();
          cara.loadPixels();
          //int p=0;
          int ss=b*w+a;
          ca = cam.pixels[b*w+a];

          ra = red (ca);
          ga = green (ca);
          ba = blue (ca);
          sumar[p] = ra;
          sumag[p] = ga;
          sumab[p] = ba;
          cp = color (ra, ga, ba);

          //output.println(ss+";"+ra+";"+ga+";"+ba+";");
          //output.println("otro pixel");
          cara.pixels[p]=cp;
          cara.updatePixels();
          p++;
          //ca = cam.get(a,b);
          //cara.set(a,b,ca);
        }
        //output.println("fila");
      }
      image(cara, 0, 0, w, h);
      cam.updatePixels();
      //output.println("otra cara");
      output.print(w*h+" ");
      for (int l=0;l<(w*h)-1;l++) {
        subtotalr=sumar[0];
        totalr=subtotalr+sumar[l+1];
        sumar[0]=totalr;
        subtotalg=sumag[0];
        totalg=subtotalg+sumag[l+1];
        sumag[0]=totalg;
        subtotalb=sumab[0];
        totalb=subtotalb+sumab[l+1];
        sumab[0]=totalb;
      }
      promedior = totalr/(w*h);
      promediog = totalg/(w*h);
      promediob = totalb/(w*h);
      promgris = (promedior+promediog+promediob)/3;
      output.println(promedior+" "+promediog+" "+promediob+" "+promgris);
      //cara.updatePixels();
    }
  }
}

/*void keyPressed() {
 output.flush();
 output.close();
 exit();
 }*/

No hay comentarios:

Publicar un comentario