Farberkennung auf dem Raspberry

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo liebe Community!

    Ich bin neu hier im Forum und ein Anfänger. Ich hoffe, ihr könnt mir helfen.

    Ich muss ein Programm schreiben, welches Farben erkennt und unterscheidet. Dieses Programm soll auf dem Raspberry laufen. Die Raspberry, welches mit einer Webcam angeschlossen ist, soll die Farben der Objekte die unter der Kamera liegen auswerten und unterscheiden. Meine Frage ist jetzt wie soll ich die ganze Sache angehen?

    Soll ich am Raspberry selber programmieren oder extern?
    Welche Programmsprache sollte ich auswählen? ( C/C++?)
    Wenn ich extern Prorgammieren muss, auf was muss ich da achten?

    Ich habe habe erfahren, dass man mit der Library "OpenCV" Farberkennung usw. realisieren kann. Wie ihr sehr, bin ich noch ein ziemlicher Anfänger und hab null ahnung, was ich tun soll.

    Ich freue mich auf eure Antworten.

  • Hallo Haruno,

    hast Du denn schon mal irgend etwas programmiert?

    Wenn ja, welche Sprache war das?

    Wenn nein, wie kommt man auf Dich, dass Du jetzt etwas programmieren musst?

    Irgendwie klingt "programmieren muss" nicht so, dass es Deine Kernkompetenzen berührt...


    Ich würde das Ganze direkt auf dem Raspberry Pi programmieren - und ich würde die Programmiersprache Icon wählen, weil ich da rein zufällig weiß, das es dort Befehle zur Farberkennung gibt.

    2013 habe ich einmal ein Programm mit graphischer Benutzeroberfläche geschrieben, dessen Ereignisbehandlung vollkommen farbbasiert verlaufen ist...

    Du brauchst eigentlich nur die Ausgabe der Webcam auf dem Bildschirm der zu programmierenden Anwendung anzuzeigen und dann die Bereiche auswählen, die Du farblich auswerten möchtest. Oder Du setzt die Maus auf den Punkt, dessen Farbcode Du haben möchtest.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Andreas!

    Ja du hast vollkommen recht. Dieses programmieren ist nicht meine Stärke.

    Es ist eine Arbeit für die Schule. Könntest du mir vielleicht detaillierte Infos geben wie ich an die Sache rangehen muss? Wäre super hilfreich!

    Danke für deine Antwort und deine Hilfe.

    Mfg Haruno

  • Hallo Haruno,

    mal ganz auf die Schnelle programmiert:

    Screenshot im Anhang.

    Anstelle des unifarbenenen Hintergrundes können auch beliebige Darstellungen platziert werden.

    Soll ja auch nur ein Beispiel der Farberkennung sein.


    Beste Grüße

    Andreas

  • Hallo Haruno,

    na, das war dann ein Schuss in den Ofen. Wochenlang wechseln wir persönliche Nachrichten, um Dich auf Spur zu bringen. Dann kommt eine lapidare Meldung, dass Dein Lehrer andere Bibliotheken eingesetzt haben möchte.

    Hier ist ein Screenshot meiner in der Zwischenzeit erarbeiteten Lösung - deren Quellcode Du wie besprochen nicht bekommen wirst, da Du die Lösung für Deine Ausbilduing eigenständig hinbekommen musst.


    Kernpunkt meiner Lösung ist ein TeachIn, wodurch dem Programm die einzelnen Farben im wahrsten Sinne des Wortes "beigebracht" werden.
    Ohne TeachIn wäre die Unterscheidung zwischen Grau und Körper bzw. Schwarz und Grau, Golden und Grau sowie Schwarz und Braun nicht möglich.

    Bei dem angehängten Screenshot finde ich es bemerkenswert, dass das Programm den grauen Farbstrich erkennt - und den goldenen Farbstrich als Golden erkennt, sowie sauber zwischen Schwarz und Braun unterscheiden kann.

    Jedes Pixel hat eine Farbe (englisch: color - um es von paint (Eimer mit Farbe/Farbstoff) zu unterscheiden), die normalerweise als RGB-Wert festgelegt wird. Du wirst ganz schnell erkennen, dass Dein Farberkennungsprogramm mit RGB nicht viel anfangen kann. Durch viele nicht zu vereinbarender und zu behandelnder Effekte (siehe PNs) schwanken die RGB-Werte der einzelnen Pixel. Bei einer Umwandlung der RGB-Werte in HSV-Werte erhältst Du klare Farbzuweisungen.

    Der Algorithmus RGB-to-HSV, wie er in den einschlägigen Nachschlagewerken beschrieben wird, funktioniert dann aber auch nicht richtig.
    Denn Rot, Schwarz, Weiß und Grau haben den gleichen Farbwert H = 0. Hier ist es erforderlich, die S- und V-Komponenten zu berücksichtigen, um klar zwischen den einzelnen Farben unterscheiden zu können.

    Wenn Du herausbekommen willst, welche Farbe ein Pixel hat, musst Du den RGB-Wert in HSV-Werte umrechnen und mittels der Methode der geringsten Fehlerquadrate herausfinden, welche der über TeachIn beigebrachten Farbe dem Pixel am nächsten kommt. Hm, auch die Methode der geringsten Fehlerquadrate musst Du anpassen, indem die einzelnen Komponenten unterschiedlich gewichtet werden.


    Woran Du auch denken musst: Jede Farbe, die eine beliebige Farbrichtung H aufweist, aber dunkel / hell ist, ist letztlich schwarz / weiß.
    Grau schließlich liegt dann vor, wenn die maximale Komponente R, G oder B gegenüber der minimalen Komponente R, G oder B ein bestimmtes Verhältnis nicht überschreitet.

    Bei meinen zuletzt durchgeführten Testläufen komme ich auf eine erfolgreiche Farberkennung von 99 - 100 % bei den den kritischen Farben (s. oben). Bei den Farben wie rot, grün, gelb, blau ist es schwer möglich, weniger als 100 % Erfolg zu erzielen :thumbs1:

    Eine automatische Farberkennung ist nur dann möglich, wenn Du die Pixel von links nach rechts abscannst und eine Kontrastmaximierung programmierst. An jeder Stelle mit einem Kontrastmaximum beginnt / endet ein Farbstrich.

    Weitere Kriterien zum Identifizieren von Farbstrichen besteht in der regelmäßigen Anordnung der Farbstriche. Die Striche haben eine gleichbleibende Breite, der Zwischenraum zum nächsten Strich ist konstant und hängt von der Strichbreite ab. Somit ist es möglich, Farbstriche zu erkennen, die bei der Kontrastmaximierung nicht direkt erkannt werden. In dem Beispiel ist dies bei dem goldenen Farbstrich der Fall, der zwar auch durch Kontratsmaxima auffällt. Diese sind jedoch geringer als bei den anderen Farbstrichen. Was bei dem goldenen Farbstrich noch auffällt, ist, dass innerhalb des goldenen Farbstriches mehrere Kontrastmaxima ermittelt werden. Ich vermute, das es von den unterschiedlichen Farbpigmenten, deren Größe, Ausrichtung und deren Reflektion abhängt.

    Somit ist die Farberkennung alles andere als trivial.

    Und hast Du erst einmal die richtigen Farben ermittelt, dann ist die Berechnung des Widerstandswertes nur noch ein kleiner Weg.


    Mein Programm erkennt nicht nur wie hier angedeutet, Widerstände mit 4 Farbstrichen, sondern berechnet auch die Widerstandswerte von Widerständen mit 5 und 6 Farbstrichen korrekt.


    Viel Spaß bei der Umsetzung!

    Beste Grüße

    Andreas

    Bilder

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (9. März 2015 um 12:39)

  • Hallo Haruno,

    was ich noch vergessen habe zu erwähnen:

    Grundlegende Datenstruktur ist ein Record, der die Farbnamen, deren RGB-Werte sowie HSV-Werte enthält. Außerdem sind noch Einträge reserviert, die der Aufnahme der Ergebnisse der Farbvergleiche nach der Minimierung der Fehlerquadrate dienen.

    Existiert keine Konfigurationsdatei, dann arbeitet das Programm mit Standard-Vorgaben, die mit ca. 50 %-iger Wahrscheinlichkeit erfolgreich erkannt werden. Ansonsten wird die Konfigurationsdatei gelesen.

    Die über TeachIn erhaltenen Messwerte werden in einer Konfigurationsdatei gespeichert. Existiert diese bereits, werden die neuen über TeachIn definierten Farben überschrieben. Auf diese Weise lernt das Programm dazu - und wird immer besser, was die korrekte Erkennung der Farbstriche betrifft.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (10. März 2015 um 13:32)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!