Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektews2013:lagemaro:start:bildana
Bildanalysator.ino
class colorSpot {
  float x; //ein "member" von colorSpot
  float y;
  boolean qualitaet;
};
 
class Bildanalysator {
 
  float rotvergleichGelbeLED;
  float gruenvergleichGelbeLED;
  float blauvergleichGelbeLED;
  float rotvergleichBlaueLED;
  float gruenvergleichBlaueLED;
  float blauvergleichBlaueLED;
  float rotvergleichLaser;
  float gruenvergleichLaser;
  float blauvergleichLaser;
  colorSpot laserposition;
  colorSpot gruenposition;
  colorSpot blauposition;
  //Die Vergleichswerte für die LED werden durch Zeiger auf die LED führen und entsprechende Taste Drücken festgelegt
  void kalibriereFarben(PImage img) {
    println("drücke auf die Taste g für gelb, b für blau oder r für rot");
    println("drücke auf die Taste f um die Kalibrierung zu beenden");
    if (keyPressed == true) {
      //wenn die Taste r gedrückt wird, werden die Farbwerte des Pixels auf den die Maus zeigt als Vergleichswerte für den Laser festgelegt
      if (key=='r') {
        println("klicke auf die rote LED / den Laserpunkt");
        rotvergleichLaser = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 0);
        gruenvergleichLaser = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 1);
        blauvergleichLaser = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 2);
      }
      //Vergleichswerte für die gelbe/grüne LED werden festgelegt
      if (key=='g') {
        println("klicke auf die gelbe LED");
        rotvergleichGelbeLED = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 0);
        gruenvergleichGelbeLED = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 1);
        blauvergleichGelbeLED = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 2);
      }
      //Vergleichswerte für die blaue LED werden festgelegt
      if (key=='b') {
        println("klicke auf die blaue LED"); 
        rotvergleichBlaueLED = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 0);
        gruenvergleichBlaueLED = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 1);
        blauvergleichBlaueLED = farbPunktFinder.gebeWerteAus(mouseX, mouseY, 2);
      }
      //Die Kalibrierung wird beendet
      if (key=='f') {
        println("die Kalibrierung ist abgeschlossen");
        kalibrierung = true;
      }
    }
  }
  //Die Toleranz mit der der Pixel, der am nächsten an den Vergleichswerten ist, als LED/Laser erkannt wird, wird verändert
  void erhoeheToleranz() {
    toleranz++;
    println("toleranz" + toleranz);
  }
  void senkeToleranz() {
    println("toleranz" + toleranz);
    if (toleranz>0) {
      toleranz=toleranz-1;
    }
  }
  //Die LEDs und der Laser werden gesucht
  void findePunkte(PImage neuesBild) {
    if (auswahl==1) {
      laserposition = hsvfarbe(1, neuesBild);
      gruenposition =hsvfarbe(2, neuesBild);
      blauposition =hsvfarbe(3, neuesBild);
    }
    else {
      laserposition = farbausgabe(1, neuesBild);
      gruenposition =farbausgabe(2, neuesBild);
      blauposition =farbausgabe(3, neuesBild);
    }
  }
  //Die gefundenen LEDs/Laser werden durch farbige Kreise um diesen Punkt gekennzeichnet
  void zeichnePunkte() {
    noFill();
    if (gruenposition.qualitaet==true) {
      stroke(255, 255, 0);
      ellipse(gruenposition.x, gruenposition.y, 10, 10 );
    }
    if (blauposition.qualitaet==true) {
      stroke(0, 0, 255);
      ellipse(blauposition.x, blauposition.y, 10, 10 );
    }
    if (laserposition.qualitaet==true) {
      stroke(255, 0, 0);
      ellipse(laserposition.x, laserposition.y, 10, 10 );
    }
  }
  //die Vergleichswerte, die in dem übergebenen und den benachbarten Pixeln sind werden zurückgegeben
  float gebeWerteAus(int i, int u, int farbe) {
    float farbvergleich = 0;
    for (int o=-1; o<2; o++) {
      int a=img.get(i+o, u);
      float rot= a>>16&0xFF;
      float gruen=a>>8&0xFF;
      float blau=a&0xFF;
      if (farbe==0) {  
        farbvergleich= farbvergleich+(rot-wertschaetzer.umgebungsgruen);
      }
      if (farbe==1) {
        farbvergleich= farbvergleich+(gruen-wertschaetzer.umgebungsgruen);
      }
      if (farbe==2) {
        farbvergleich = farbvergleich+ (blau-wertschaetzer.umgebungsblau);
      }
    }
    if (farbe==0) {  
      println("rot "+farbvergleich/3);
    }
    if (farbe==1) {
      println("gruen "+farbvergleich/3);
    }
    if (farbe==2) {
      println("blau "+farbvergleich/3);
    } 
    return (farbvergleich/3);
  }
  //Wenn das hsv-farbsystem ausgewählt wurde, werden mit dieser Funktion die LEDs erkannt (ohne Vergleich)
  colorSpot hsvfarbe(int farbe, PImage img) {
    colorSpot ergebnis=new colorSpot();
    float wertmax=1;
    float farbwert=1;
    for (int u=0;u<img.height;u++) {
 
      for (int i=0;i<img.width;i++) {
        int a=img.get(i, u);
        int rot= a>>16&0xFF;
        int gruen=a>>8&0xFF;
        int blau=a&0xFF;
        float[] hsbvals= new float[3] ;
        Color.RGBtoHSB (rot, gruen, blau, hsbvals);
        if (farbe==1) {
          if (hsbvals[0]>0.5) {
            hsbvals[0] = 1-hsbvals[0];
          }
          farbwert=sqrt(sq(0-hsbvals[0])+sq(1-hsbvals[1])/2+sq(0.8-hsbvals[2])/4);
        }
        if (farbe==3) {
          farbwert=sqrt(sq(0.55-hsbvals[0])+sq(1-hsbvals[1])+sq(0.8-hsbvals[2])/4);
        }
        if (farbe==2) {
          farbwert=sqrt(sq(0.15-hsbvals[0])+sq(1-hsbvals[1])+sq(0.8-hsbvals[2])/4);
        }
        if (farbwert < wertmax) {
          wertmax = farbwert;
          ergebnis.x=i;
          ergebnis.y=u;
        }
      }
    }
    if (wertmax<0.25) {
      ergebnis.qualitaet=true;
    }
    else {
      ergebnis.qualitaet=false;
    }
    return ergebnis;
  }
  //Wenn das rgb-farbsystem ausgewählt wurde, werden mit dieser Funktion die LEDs erkannt (mit Vergleich)
  colorSpot farbausgabe(int farbe, PImage img) {
    colorSpot ergebnis=new colorSpot();
    float wertmax=300;
    float farbwert=0;
    for (int u=0;u<img.height;u++) {
 
      for (int i=0;i<img.width;i++) {
        int a=img.get(i, u);
        int rot= a>>16&0xFF;
        int gruen=a>>8&0xFF;
        int blau=a&0xFF;
        float rotrest=rot-wertschaetzer.umgebungsrot;
        float gruenrest=gruen-wertschaetzer.umgebungsgruen;
        float blaurest=blau-wertschaetzer.umgebungsblau;
        if (farbe==1) {
          farbwert=sqrt(sq(rotvergleichLaser-rotrest)+sq(gruenvergleichLaser-gruenrest)+sq(blauvergleichLaser-blaurest));
        }
        if (farbe==3) {
          farbwert=sqrt(sq(rotvergleichBlaueLED-rotrest)+sq(gruenvergleichBlaueLED-gruenrest)+sq(blauvergleichBlaueLED-blaurest))/2;
        }
        if (farbe==2) {
          farbwert=sqrt(sq(rotvergleichGelbeLED-rotrest)+sq(gruenvergleichGelbeLED-gruenrest)+sq(blauvergleichGelbeLED-blaurest))/2;
        }
        if (farbwert < wertmax) {
          wertmax = farbwert;
          ergebnis.x=i;
          ergebnis.y=u;
        }
      }
    }
    if (wertmax < toleranz) {
      ergebnis.qualitaet=true;
    }
    else {
      ergebnis.qualitaet=false;
    }
    return ergebnis;
  }
}
projektews2013/lagemaro/start/bildana.txt · Zuletzt geändert: 2016/01/21 12:45 (Externe Bearbeitung)