Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
projektews2013:lagemaro:start:bildana [2014/03/07 19:16] philippkueckes angelegt |
projektews2013:lagemaro:start:bildana [2016/01/21 12:45] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | <file C++ Robo_Läuft.ino> | + | <file C++ 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; | ||
+ | } | ||
+ | } | ||
</file> | </file> |