Einstieg CS DualWebcam
#Einleitung
Ich habe mich im Zuge einiger Steuerungsvorhaben mal wieder ein bisschen am Programmieren versucht.
Nachdem ich einiges rumgesucht und probiert habe, bin ich bei der Programmiersprache C# geblieben. Diese verfügt über ein sehr hohes Maß an Fähigkeiten, ist aber auch nicht zu kompliziert, um (schnell) ans Ziel zu kommen.
Wie dem auch sei... bei der Wärmebildkamera hatte ich schon mal eine Software, welche 2 Webcams gleichzeig verwendet hat. Diese war in Visual Basic 6.0 geschrieben und hatte neben einigen Macken auch nicht gerade die höchste Ausführungsgeschwindigkeit. Deshalb habe ich mich mehr mit der alternative C++ beschäftigt und bin kurze Zeit später auf C# gewechselt, da es um einiges einfacher ist, dafür aber nur geringe Geschwindigkeitseinbußen in kauf genommen werden müssen.
Ich habe eine vorhandene Projektdatei genommen, sie in ihre Bestandteile zerlegt (um die Funktionsweise zu verstehen) und umgeschrieben.
Quellcode: Laser Guided Tic Tac Toe Game using Webcam For Vision
Meine Änderungen:
- Spielrutine
Wurde entfernt. - Zweite Kamera hinzugefügt
Außerdem wurde die Auswahl der Kamera in das Hauptprogramm übernommen. Somit kann während das Programm läuft, eine neue Kamera hinzugefügt werden. - Kameraeinstellungen
Nun kann man entscheiden, mit welcher Auflösung die Kamera gestartet werden soll und welche Frameraten sie haben soll. - DLL Aktualisiert
Die Version der Bildfilter DLL (AForge) wurde von 2.0.0.0 auf 2.1.2.0 erweitert. (Nach der Umstellung funktionierte erst mal der Objektfilter nicht mehr in seiner vorherigen Konfiguration. Diese Akt war erheblich zeitaufwendiger als die 2te Kamera, aber jetzt geht’s ja und die Funktionen sind den Aufwand wert) - Diverse Bildfilter hinzugefügt
Es sind zwar nicht sonderlich viele, aber damit kann man schon einiges anstellen.
#Testaufbau
Ich habe das Programm so eingestellt, dass es automatisch beim Starten aus den vorhandenen Kameras, die ersten 2 auswählt und direkt startet. Wurden keine gefunden, wird man mit einer Infobox begrüßt, die eine "Menge der Kameras: 0" meldet. Während das Programm läuft, kann man beide Kameras Starten, Stoppen oder nach neuen Kameras suchen lassen.
Für die Einstellung der Auflösung und Framerate, sollte man wissen, welche Werte unterstützt werden. Ich hab mir (noch) nicht die Mühe gemacht, da großartig was abzufragen. Man kann die Kamera auch mit 640x481 starten... nur verweigert sie dann eventuell ihre Dienste.
Die gefundenen Kameras werden auf beiden Seiten in Auswahlboxen eingetragen. Diese Auswahlboxen signalisieren über ihre Schriftfarbe, wie es um die Kamera stehe sollte (Grün = Kamera Aktiv | Gelb = Kameras gefunden | Rot = Kameras gestoppt).
Während die linke Pictruebox nur das Bild der Webcam anzeigt, ist die rechte mit Zusatzfunktionen wie Imageprocessing, Filter anzeigen usw. ausgestattet.
Wenn man nur eine Kamera hat, kann man auch das Originalbild der Kamera auf der linken und das bearbeitete Bild auf der rechten Picturebox anzeigen lassen. Wenn keine Kamera Verbunden wurde, kann man auch mit " Testbild OFF" ein Bild laden (test.jpg) und an diesem die Filter anwenden. Einige Filter haben dann aber keine Wirkung.
Test 1
Ein Farbfilter ist auf rot eingestellt und das rote Objekt wird in ein grünes Rechteck eingebunden. Wenn der Stift bewegt wird, folgt das grüne Kästchen dem roten Stift. Position und Abmessungen sowie Pixelmenge werden unten links eingeblendet. Gesucht wird nicht das größte Objekt in einer gewissen Farbe, sondern das Objekt mit den meisten Pixeln im inneren.
Test 2
Ein Filter, der gefundene Ecken mit einem roten Punkt markiert.
Test 3
Farbfilter auf grün eingestellt, diesmal wird also das grüne Objekt verfolgt. Außerdem wird nur eine Kamera verwendet. Das linke zeigt das Bild von der Kamera, das rechte Bild zeigt die Filterergebnisse an.
#Funktionsweise
Hauptbestandteil des Programms ist eine open source image processing library (AForge.NET) welche diverse Möglichkeiten zur Bildbearbeitung in sich vereint. Verwendet wurde bei mir die Version 2.1.2.0 welche leider noch ein paar kleine Fehlerchen hat. Beispielsweise wird das Eingabefenster für die Treibereinstellungen nicht immer geöffnet oder Teile davon sind abgeschaltet. Aber wenn man Wert auf eine bessere Kamerasteuerung legt, kann man ja auch eine der vielen anderen Möglichkeiten verwenden, die es so gibt (zur not Captain google fragen). Da ich mehr am eigentlichen image processing interessiert bin, reicht die Kamerasteuerung so aus, da sie für gewöhnlich sowieso nur einmal eingestellt wird und dann so bleibt.
Ansonsten ist der eigentliche Vorgang relativ einfach aufgebaut:
- Bild von der Kamera Kopieren
- aktivierte Filter auf die Kopie anwenden
- Bild nochmal kopieren und in Graustufen umwandeln (um die Helligkeit der Pixel auszuwerten)
- Objektfilter anwenden (sucht nach zusammenhängenden Pixeln, die nicht schwarz sind und analysiert diese)
- Objekte des Filters sortieren (wird schon vom Objektfilter übernommen, kann aber auch extern erledigt werden... für "Sonderwünsche")
- Die Werte des größten Objekts auslesen und dessen Werte auf das Bild der Kamera zeichnen
- das bearbeitete Kamerabild dann anzeigen
Der Ablauf würde dem entsprechen, was man oben im Test 1 betrachten kann.
Würde bei der Funktion "Bild filtern" ein Häkchen sein, dann würden die Werte auf die erste Kopie (mit den angewendeten Filtern) dargestellt und angezeigt werden. Ein solches Resultat sieht man bei Test 2 und Test 3.
Das größte Objekt wird bei mir mit einer Sortierung nach .Area (menge der Pixel im Objekt) erreicht. Man kann aber auch nach .Size (maximale Abmessungen: Höhe x Breite) oder anderen sortieren lassen.
#Download
Folgendes sollte zusätzlich runtergeladen werden, wenn man sich das Dual Webcam Programm mal nähern ansehen möchte:
- .NET Framework 3.5 Service Pack 1
Wird benötigt, damit .NET Programme überhaupt laufen können. Wird schon seit Vista mitgeliefert, aber in einer geringeren Version. - SharpDevelop 3.2
Eine open source Entwicklungsumgebung für C#, Visual Basic .NET und Boo. Ich programmiere nur mit dieser Software und mit ihr sehr zufrieden.
Eine ebenso kostenlose alternative, wäre von Microsoft ( Visual Studio 2010 Express)
Zuletzt geändert am: Okt 23 2011 um 3:47 PM
#Pseudocolor
#Einleitung
Nachdem ich mich mit Videoerfassung und Bildbearbeitung von Videosignalen beschäftigt hatte, wollte ich mich näher mit der Falschfarben Darstellung (Pseudocolor) beschäftigen.
Eigentlich ist es nichts weiter, als ein grafischer Filter wie "Negativ" oder "Schärfen", aber die Anwendungsbereiche sind andere.
Wenn Pseudocolor nicht gerade als optischer Gag in normalen Bildern verwendet wird, benutzt man es auch gerne mal in Bereichen, wo es keine Farben gibt. Denn Bilder, die in einem anderen Spektrum als das Licht aufgenommen wurden, haben logischerweise nicht die Farben des Lichts. Röntgenbilder (unterhalb des Lichtspektrums) und Wärmebilder (oberhalb des Lichtspektrums) haben beispielsweise eine Intensität, aber keine Farben.
Man kann aber die gesamte Intensität in einzelne Blöcke unterteilen und jeden von ihnen eine Farbe zuweisen. Bei der Pseudocolor geht es genau darum.
Statt einer Darstellung von schwarz nach weiß in sehr feinen Abstufungen, kann man ebenso mit Pseudocolor in gröberen Schritten beispielsweise von schwarz über blau über grün über rot nach weiß gehen. Dadurch ist es besser möglich, sehr feine Differenzen wahrzunehmen, da sie so hervorgehoben werden.
#Funktionsweise
Wiedermal ein wichtiger Bestandteil des Programms ist die open source image processing library (AForge.NET).
Die Umwandlung arbeitet so:
- Bild laden
- Farbpalette erstellen (optisch und als Farbtabelle)
- Bild in Graustufen umwandeln (sicherheitshalber, falls noch Farbe vorher im Bild ist. Außerdem wird das Bildformat dadurch angepasst.)
- Farbtabelle auf das Bild anwenden
Sinus Linie
Der erste Weg ans Ziel (links im Bild) ist eine Sinusrechnung. Dafür habe ich mich einer netten Vorlage bedient (ColorMap für Falschfarben) die ich noch ein bisschen angepasst habe. Hier werden die 3 Hauptfarben in einem Algorithmus berechnet, der sie um 90° versetzt rotieren lässt.
Ergebnis der Berechnung ist eine Farbtabelle für einen sehr harmonisch fließenden Farbverlauf über das Spektrum. Diese Farbtabelle wird einerseits auf ein (zuvor erstellten) Graustufen Farbverlauf und andererseits auf das Hauptbild angewendet.
Linear Linie
Der zweite Weg ist wesentlich einfacher. Mir ist eine Zeichenfunktion aufgefallen, mit der man lineare Farbverläufe Zeichen kann ( Use LinearGradientBrushes in C#) . Ich erstelle also eine Bitmap mit einer Breite von genau 256 Pixeln (oder Höhe wenn der Verlauf vertikal sein soll). In diesem Bitmap lasse ich vom Anfang bis zum Ende einen gewünschten Farbverlauf zeichnen. Dann lese ich, über eine Schleife, den Farbwert jedes Pixels aus und erstelle damit die Farbtabelle (von Pixel 1 bis 256 werden die Tabellenwerte von 0 bis 255 gelesen). Diese Farbtabelle wird dann auf das Hauptbild angewendet.
Nachteil ist aber, das nur direkte Farbverläufe gezeichnet werden. Von grün nach rot lässt deshalb grün sinken und rot steigen, ein gelb dazwischen entsteht deshalb nicht wirklich, weil dafür beide oben sein müssten. Deshalb muss man den Regenbogenfarbverlauf um diese Zwischenfarben zusätzlich erweitern.
Mein Programm ist im Prinzip nur ein Bildbetracher, mit dem man SW Wärme oder Röntgenbilder im Farbverlauf betrachten kann. Ich hoffe der Sourcecode ist für alle hilfreich, die sich ebenso damit beschäftigen wollen.
Die gepackte Datei unten, enthält genau wie bei der Dual-Webcam den Sourcecode. Im Ordner bin/release/ ist eine Anwendung, die direkt gestartet werden kann (wenn man das Framework installiert hat...).
#Download
Zuletzt geändert am: Mai 02 2013 um 5:41 AM