Image Analyzer
#Einleitung
Dieses Programm entstand nach und nach unter Verwendung der AForge.NET Librarys.
Es geht im Grunde genommen darum, die von einer Videoquelle (Webcam, Videograbber...) erfassten Bilder mit diversen Filtern entsprechend weiterzuverarbeiten. So kann man Farben raus filtern, Bewegungen und Objekte erkennen und anderes.
Hauptsächlich hatte ich das Programm dazu benutzt, den einen oder anderen Filter etwas näher kennen zu lernen.
Später hab ich Teile davon öfters als Vorlage verwendet. Ich möchte diese Vorlage nun auch anderen zur Verfügung stellen.
Ich werde dieses Programm wahrscheinlich nur noch wenig erweitern. Es gibt genügend Programme, die das eine oder andere um Längen besser machen (und sich dies ja auch entsprechend was kosten lassen). Ich beschäftige mich daher lieber mit anderen Dingen. Das Programm ist knapp 1 Jahr alt und wurde immer mal zwischendurch überarbeitet. Auch wenn ich mir Mühe gegeben habe, werden bestimmt noch die einen oder anderen Problemchen in den Tiefen des Quellcodes stecken. Vor allem die Wechselwirkung einiger Komponenten hat sich manchmal als schwierig erwiesen.
Ich bin dennoch dankbar dafür, wenn jemand einen Fehler findet und an mich weiterleitet. Wenn ich die Zeit (und Lust) dazu finde, werde ich den Fehler dann auch abstellen.
#Programmoberfläche
Es ist bisher mein komplexestes Programm und es ist älter als der Spektro Analyser, der hiervon teilweise abstammt.
Hier gibt’s eine Menüleiste, die fester Bestandteil der Arbeitsoberfläche ist. Damit lassen sich Zusatzmenüleisten einschalten, die frei positionierbar sind (ähnlich wie bei Office). Dadurch kann man selbst entscheiden, wie man die Darstellung gern hätte. Vor allem hilfreich, wenn man ein kleines Display (wie beim Sony UX) hat.
Die linke Maustaste öffnet eine Zoombox, welche ich damals im Computerspiel Machwarrior 3 sehr angenehm fand. Letztlich ist es Geschmacksache, aber ich zoome lieber einen Ausschnitt des Bildes, als das gesamte Bild, wie bei Bildbetrachtern üblich, da so der Überblick verloren geht.
Die Filtersteuerung habe ich vor einiger Zeit in einer eigenen Form untergebracht. Es erscheint dann ein extra Fenster, was man sich nach belieben positionieren kann. Es ist standardmäßig im Vordergrund (kann abgeschaltet werden), damit der Zugriff darauf leichter ist. Eine Filterleiste befindet sich auch auf der Hauptoberfläche. Dort sind die für mich interessantesten Filter zum direkten einschalten hinterlegt.
Das Programm ist nur recht wenig auf Multithreading ausgelegt, da es schon älter ist und wie gesagt nur als Vorlage dient.
Wenn man also eine Kamera auf höhere Auflösungen schaltet, muss man sich (je nach Verwendung der Filter) mit entsprechenden Leistungseinbußen begnügen. Wer nur einen Prozessorkern hat, hätte ohnehin nix davon.
Letztendlich ist das Programm eine softwareseitige Weiterbearbeitung der Bildinformationen. Es ist die einfachere Methode, da man nur eine Kamera und einen Rechenstarken PC braucht (je nach Anwendung der Filter und Auflösung, der kleine Sony UX schafft mit seinen 1,33GHz ja auch schon so einiges). Wenn man es besser machen will, sollte möglichst viel von der Hardware übernommen werden, aber das ist ein anderes Thema.
Außerdem sei noch zu erwähnen, dass die Rechenauslastung generell recht hoch ist, da die Bildverarbeitung fortlaufend berechnet wird.
Anders als bei einem normalen Bildbearbeitungsprogramm, werden bei diesem die Filter nicht einfach nur auf das Bild angewendet und dann so dargestellt. Es gibt eine Bildquelle (eine Picturebox im Hintergrund) von der fortlaufend ein Bild geladen, mit den Filtern bearbeitet und dann dargestellt wird. Später wird wieder ein Bild von da geladen usw.
Es gibt einen online und einen offline Timer. Der online Timer greift auf das Kamerabild zu, der offline Timer auf ein Bild im Hintergrund (von der Kamera aufgenommen, oder vom PC geladen über Drag & Drop). Wenn man nur einen Kantenfilter auf ein Standbild anwenden will, ist es natürlich von Nachteil, dass sich das Bild mit den gleichen Werten aktualisiert. Aber ausgelegt ist das Programm ja für die Verwendung einer Kamera. Und da muss jedes Bild aufs Neue bearbeitet werden.
#Funktionen
Die Reihenfolge der Filter ist durch das Programm festgelegt. Die Wechselwirkung der Filter ist ein recht komplexes Thema. Daher muss man für andere Funktionen teilweise einiges durcheinander Würfeln und aufpassen, was ein Filter als Quelle braucht und was er erzeugt.
Angenommen man stellt eine Kamera an den Ausgang eines Druckers, um automatisch zu prüfen, ob der Ausdruck Fehler aufweist (Kamera mit eigener Beleuchtung und abgeschirmt von Fremdlicht, da es die Ergebnisse beeinflusst).
Folgende Vorgehensweise wäre denkbar:
- Die zu druckende Datei in ein Bild Umwandeln und als Referenzbild nehmen
- Vom Referenzbild das Kamerabild subtrahieren
- Zusätzlich: Ein Farbfilter zwischensetzen um die Fehlerrate einzelner Farbkanäle (CMYK) zu bestimmen
- kleinere Differenzen durch den Threshold Filter entfernen
- Objektfinder anwenden und sich die Fehler anzeigen lassen
Durch die Angaben des Objektfilters ist dann bekannt, wie groß die Abweichung ist und ob eine automatische Unterbrechung/Reinigung eingeleitet werden sollte.
- Würde man in diesem Fall den Objektfinder zuerst nehmen, hätte man meistens nur ein Objekt... das ganze Bild.
- Würde man den Threshold Filter vor den Subtrahier Filter packen, hätte man ein S/W Bild als Kamerabild und Differenzen, die den größten Teil des Bildes betreffen.
Alles im allen macht es also die Mischung. Daher sind viele einschaltbare Filter nicht die Filter allein, sondern oft auch mal ganze Filterblöcke.
#Kantenfinder
Ein Kantenfilter findet man bei fast jedem Bildbearbeitungsprogramm.
Die Funktion ist relativ einfach, im groben geht es so: hat der Pixel neben dem aktuellen einen ähnlichen Wert, wird der Pixel schwarz gefärbt. Bei unterschieden, wird er weiß gefärbt. Am Ende werden die Übergänge von Farben und Helligkeiten als weiße Kante dargestellt, während der Rest schwarz ist. Bei diesem Filter werden aber mehrere Pixel mit einbezogen.
#Farbfilter
Der Farbfilter und auch der Objektfinder, wurden ja schon in meinen ersten C# Versuchen verwendet.
Nun kann der Bereich, der raus gefiltert wird auch als Graustufenbild angezeigt werden. Ein netter Effekt um eine Farbe oder ein Objekt entsprechend hervor zu heben.
#Objektfinder
Der Objektfinder setzt alle nicht schwarzen und benachbarten Pixel zu einem Objekt zusammen. Das hat dann eine Höhe, Breite, Pixelanzahl und einen Punkt, um den sich die meisten Pixel des Objekts befinden (Center of Gravity). Objekte die zu klein sind (in diesem Fall 20 Pixel Breite und Höhe), lassen sich raus filtern. Mit Threshold lassen sich Pixel mit geringerer Intensität ebenso raus filtern.
Ist ein Objekt erst mal gefunden und seine Position bestimmt, lässt sich allerhand Unfug mit den Daten anstellen. So kann man eine Webcam beispielsweise auf 2 Servos montieren (einen zum drehen und einen zu schwenken). Die Ablenkung X und Y werden dann umgerechnet und an die Servos weitergeleitet. Dann hat man eine Kamera, die einem Farbigen Objekt folgt, wenn es sich aus dem Sichtbereich der Kamera bewegt.
Man kann die Kamera aber auch nehmen um Objekte zu zählen. Eine schwarze Unterlage, ein bisschen Abstand zwischen den Objekten und ein gut eingestellter Farbfilter, dann wird der Objektzähler brauchbare Werte liefern.
#Pseudocolor 1
Die Falschfarbdarstellung hab ich in diesem Programm schon benutzt. Es sind ein paar Farbscalen und Einstellungen dazugekommen.
Hier die Regenbogendarstellung.
#Pseudocolor 2
Man kann auch einen 2 oder 4 fachen Farbverlauf mit seinen eigenen Wunschfarben anpassen.
#Binary Dithering
Binary Dithering (FloydSteinbergDithering)
Das Bild ist ein reines schwarz/weiß Bild. Die Graustufen entstehen dadurch, dass die örtliche Pixelkonzentration der Helligkeit nach angepasst wurde. So kann man auf einem Display, das keine Abstufungen kennt (zb. eine LCD-Matrix), dennoch eine Helligkeitsabstufung darstellen.
#Substract
Ein ebenso recht einfacher Filter. Der Subtrahier-Filter macht nix weiter, als jeden Pixel von der Kamera, von einem an der gleichen Position befindlichen Pixel eines Referenzbildes zu subtrahieren. Wenn man also wie im Beispiel unten das aktuelle Bild als Referenz nimmt und dann das Kamerabild davon subtrahiert, dann erhält man ein schwarzes Bild.
Meine Hand ist teilweise etwas heller als das Referenzbild, was dann zu dem unten sichtbaren Effekt führt.
#Add
Wenn beide Bilder miteinander Addiert werden, erreicht man schnell den Bereich der Übersteuerung. Daher ist das Bild relativ hell, obwohl ich Referenz- und Kamerabild in etwas gedimmten Licht aufgenommen habe.
Der Effekt ist derselbe, wie bei einer normalen Fotokamera von früher, wenn man ein Bild einfach mehrfach belichtet hat. Ein Klassiker, wenn es um die Entstehung von "Geisterbildern" geht.
#Dual Camera
Die Dual Webcam, wurden ja ebenfalls schon in meinen ersten C# Versuchen verwendet. Hier wird allerdings das Kamerabild direkt ins Hauptbild integriert. Recht nützlich, wenn man eine Wärmebildkamera mit Videoausgang hat. Dann kann man sich das Graustufenbild in Farbe umwandeln lassen und an einer Position das Visuelle Hintergrundbild mit dem Wärmebild überblenden lassen.
Die Funktionen sind hier aber nicht sonderlich weitreichend... es ist eben auch nur eine Vorlage.
#Ebenen Funktion
Diese Funktion ist im Grunde recht einfach:
- Es wird ein Hintergrund definiert.
- Das Hauptbild wird darüber gezeichnet (außer Pixel, die einer definierten Transparenzfarbe entsprechen).
- Dann wird ein weiteres Bild darüber gezeichnet (außer Pixel, die einer definierten Transparenzfarbe entsprechen).
Dadurch handelt es sich um einen sehr beliebten Effekt aus der Film und Fernsehindustrie.
Man packt einen Objekt (oder eine Person) vor eine grüne oder blaue Wand und lässt vom Computer diese Farbe entfernen. Wichtig ist, dass die Hintergrundfarbe nur in Bereichen vorhanden ist, wo später was fehlen soll. Idealerweise ist es eine Farbe, die stark im Kontrast mit dem Objekt ist. Dann nutzt man den Farbfilter, um die Hintergrundfarbe gegen schwarz zu tauschen. Dieses schwarze wird dann weg gelassen, wenn das Bild über den Hintergrund gezeichnet wird. Dann wird ein weiteres Bild über beide gezeichnet, wobei wieder eine definierte Hintergrundfarbe weg gelassen wird. Bei richtigen Farbfilteranwendungen wird man natürlich nicht über schwarz, sondern eine Farbe gehen, die nicht im Bild vorkommt (z.B. Fuchsia oder Magenta). Der AForge Farbfilter generiert schwarz. Ich hab noch einen eigenen Farbfilter (Typ 2) für eine Farbe eingebaut, bei dem die Generierte Hintergrundfarbe eingestellt werden kann. Bei mir ist Fuchsia Standard.
Was hier per Software gemacht wird, lässt sich bestimmt besser mit Hardware erreichen. Wie im Artikel Kamerasensor beschrieben, sendet ein Digitaler Kamerachip seine Bilddaten als Datensatz. Wenn man nun die Daten nicht direkt an das Display sendet, sondern stattdessen eine einfache Abfrage verwendet:
Wenn Pixelfarbe grün größer als X, sowie blau und rot kleiner als Y dann Pixel vom Hintergrundbild verwenden, sonst Kamerapixel verwenden.
dann hat man eine Kamera, die direkt das gefilterte Bild liefert. Anstatt einem Statischen Bild, kann man natürlich auch eine zweite Kamera nehmen. So kann man später einen Schwenker durch eine Landschaft machen, in der sich Leute bewegen... die sich da nicht wirklich befunden haben.
Bei den täglichen Nachrichten wird der Nachrichtensprecher ebenfalls hinter in einem Studio mit Farbhintergrund aufgenommen. Das Hintergrundbild ist da meistens auch nicht statisch sondern dynamisch vom PC generiert.
Lange rede kurzer Sinn. Die Funktion ist zwar recht rudimentär, aber sie erfüllt für den einen oder anderen Hobbybastler ihren Zweck.
#Video Funktion
Die Videofunktion wird ebenfalls mit den DLLs von AForge ermöglicht. Es handelt sich um einen sogenannten AVI-Reader und AVI-Writer.
Sound kann hiermit nicht aufgenommen werden, es handelt sich um ein rein optisches Programm.
Folgende Videoeinstellungen sind bei der Erstellung Möglich:
- Codec (auswahlliste der installierten AVI Codecs)
- Breite und Höhe (die Angaben müssen mit den Hauptbildabmaßen übereinstimmen)
- FPS (die Menge der Bilder pro Sekunde)
- Dateiname
Bei der normalen fortlaufenden Aufnahme, wird bei jeder Bildaktualisierung ein Bild aufgenommen. Alternativ kann man einzelne Bilder (Frame) hinzufügen.
So kann man beispielsweise auch eine AVI mit 1 FPS erstellen und nach und nach Bildern hinzufügen. Das Video entspricht dann einer Diashow mit 1S Verzögerung. Für sinnvoll halte ich das nicht, aber möglich ist es.
Man könnte auch noch einen Timer hinzufügen, der in gewissen Abständen ein Frame zum Video hinzufügt. Das würde dann einem Zeitraffer entsprechen. So kann man einer Pflanze beim wachsen zusehen. Während der Aufnahme wäre allerdings die ganze Zeit die Datei gesperrt... halte ich ebenso nicht für sinnvoll.
Man könnte natürlich auch eine Kombination aus Wiedergabe und Aufnahme machen. Dass bei einem erfolgten Bild das Video geöffnet, erweitert und wieder geschlossen wird. So kann man sich währenddessen mal einen Eindruck der Aufnahme verschaffen.
Aber nun zurück zur eigentlichen Funktion. Ein Video wird hier generell ohne Ton aufgenommen. Aber dafür, kann jedes Bild von der Kamera bearbeitet als Videobild übernommen werden. Es ist ebenso gewissermaßen möglich, damit ein AVI Video zu schneiden. Dafür muss man das gewollte Video öffnen und dann parallel dazu eins erstellen. Man kann ein Video wiedergeben und gleichzeitig ein anderes Aufnehmen... also eine Art Kopie erstellen. Zwischendurch kann man die Aufnahme anhalten, was anderes einfügen und dann wieder weiterlaufen lassen.
Bei der Wiedergabe kann man einzelne Frames oder eine eingestellte Menge vor oder zurück springen. Die Speed Funktion beeinflusst, wonach sie benannt wurde. Ist sie eingeschaltet, bleibt das Video erst mal stehen. Dan kann mit dem Schieberegler entschieden werden, ob es vor oder zurück, langsam, normal oder schnell gehen soll.
Aber für all solche Spielereien gibt es bestimmt bessere Programme, weshalb ich das hier auch nicht großartig weiter verfolgt hab.
#Videobeispiel
In diesem Video habe ich das Videosignal, durch einen Videograbber, von der Wärmebildkamera aufgenommen. Die Falschfarbdarstellung hab ich weg gelassen, damit ich im Nachhinein noch Handlungsfreiraum habe.
Wenn ein Video mit dem Programm wiedergegeben wird, durchläuft es von der Anzeige ebenfalls alle Filter. So kann man ein bestehendes Video entsprechend nachbearbeiten oder einfach dessen Betrachtungsweise ändern.
Ich hab auch gesehen, dass sich AForge in seinem Funktionsumfang zwischenzeitlich erweitert hat (Beispiel: GRATF).
Die bei mir in Version 005 verwendeten Libs sind Version 2.1.5.0
#Download
ia source 005 (ZIP, 495.64 KB)
Zuletzt geändert am: Jul 11 2017 um 9:54 PM