Prüfen von Funktionalität von Status-LEDs über USB-Kamera mit Bilderkennung
-
Hallo,
ich habe die Aufgabe bekommen, ein Programm unter Linux in C++ (oder evtl. C) zu entwickeln, das mit Hilfe einer angeschlossenen USB-Kamera eine Überprüfung von LEDs an einem PC durchführt. Die LEDs sind übereinander angeordnet und es sind ca. 10 LEDs. Die LEDs können alle gleichzeitig aktiviert werden, was das Erkennen der LEDs erleichtern sollte.. Es soll am Ende dann automatisch erkannt werden, welche LEDs leuchten (bzw. nicht) und auch die Farbe kontrolliert werden (grün, gelb, rot).
Bisher erhalte ich die Daten der Kamera über UNICAP bzw. libunicap (http://unicap-imaging.org/), mir fehlt aber das Wissen, wie man bei sowas am Geschicktesten in welchen Fällen vorgeht.
Die Implementierung soll so klein wie möglich gehalten werden, d.h. auf große LIBs soll verzichtet werden. Ich habe schon viel über die openCV-Lib gelesen, aber die ist wohl zu groß, und ich hoffe darauf, dass ich auch ohne eine große Lib zum Ergebnis kommen kann, da die openCV wohl für mein kleines Problem sowieso überladen wäre.Ich bin leider neu auf dem Gebiet der Bilderkennung / Bildverarbeitung, und hoffe ich kann hier ein paar Tipps/Hilfestellungen erhalten. Die grobe Vorgehensweise wäre nach meinem bisher gewonnenen Wissen eine Filterung des erhaltenen Bildes, eine Kantenerkennung (oder Objekterkennung?), das Ermitteln der LED-Positionen (also anhand der erkannten Kanten die Regionen der LEDs ermitteln), und anhand dieser Positionen die Farbe ermitteln.
Leider fehlt mir das Know-How welche Kombination von Filter- und Kantenerkennungsverfahren usw. sich in diesem Fall am besten eignen würde. Aus der Menge an Möglichkeiten fällt es mir schwer zu erkennen, wie ich am optimalsten Vorgehen kann.
P.S. Auch über Literaturhinweise zu diesen Themen würde ich mich freuen.
Grüße und Danke,
Chris
-
wenn die camera statisch positioniert ist, brauchst du keine grossartige erkennung.
du musst einmal pro LED dir ein bild ablegen mit den 4 moeglichen zustaenden (aus,gruen,gelb,rot).
dann, beim gecapturten bild vergleichst du zu welchem der 4 bilder pro LED die kleniste differenz aller pixel liegt.
als optimierung kannst du bei den 4 referenz bildern (PRO LED) dir ablegen wo der unterschied liegt (also pixelweise im bild, vielleicht mit einer kleinen tolleranz), das sollte das ganze bei verschiedenen tageszeiten noch korrekt laufen lassen.
btw. differenz pro pixel berechnest du indem du das delta pro farbkanal quadrierst und dann aufakkumilierst. manchmal nutzt man auch sum of absolut difference (SAD), das gibt es bei SSE als instruktion, falls du mal performance probleme hast
-
Hi rapso,
danke erstmal für die schnelle Antwort.
So wie ich das verstehe meinst Du mit "statisch positioniert", dass die Kamera immer "das gleiche Bild" aufnimmt, also dass die LEDs auf dem aufgenommenen Bild immer genau die gleiche Position haben, oder?
Leider kann ich, von dem was ich bisher weiß, nicht davon ausgehen, da die Position des zu prüfenden PC, an dem die LEDs eingebaut sind, (zumindest leicht) ändern kann. Außerdem müsste ich dann ja jede LED einzeln ansteuern können um die 4 unterschiedlichen Zustände aufnehmen zu können und auch anschließend mit diesen aufgenommenen Bildern den tatsächlichen Zustand abzugleichen. Eine Aktivierung einzelner LEDs ist aber auch nicht möglich.
Ich werde deinen Vorschlag aber auf jeden Fall in Betracht ziehen.
Noch sind mir leider auch noch nicht alle Umstände, insbesondere die Möglichkeiten der Ansprache der LEDs bekannt.
-
wenn du es nicht automatisch justieren kannst, dann vielleicht per hand?
mit ner kleinen gui oder so, auf der jemand die einzelnen LEDs mal anklickt?
dann nimmst du einfach den pixel an der stelle des klicks und pruefst die einzelen farb kanaele,
falls rot > 90% und gruen <50% und blau <50% dann leuchtet rot
oder
falls rot < 50% und gruen >50% und blau <50% dann leutet gruenusw.
-
Per Hand / GUI justieren geht leider auch nicht. Das ganze muss automatisch ablaufen, also der Test soll ohne Einwirkung einer Person ablaufen.
Eine GUI / Anzeige soll es sowieso nicht geben, außer natürlich am Ende das Ergebnis ob alles in Ordnung ist oder eben etwas nicht stimmt.