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>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>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; } }