Einstieg: Dual Webcam und Imageprocessing in C#

Veröffentlicht von Joe-C (jch) am Oct 23 2011
Software >>

Index

Zurück zur Übersicht

Einleitung

zurück zum Index


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

zurück zum Index


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).

Testaufbau
Auflösung: 1280x960

Screenshot
Auflösung: 1280x768

 

 
  •  
  •  

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.

In den Folgenden 3 Beispielen:

  • 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.

Test 1
Auflösung: 1280x768

Test 2
Auflösung: 1280x768

Test 3
Auflösung: 1280x768

 
  •  
  •  
  •  

Funktionsweise

zurück zum Index


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:

  1. Bild von der Kamera Kopieren
  2. aktivierte Filter auf die Kopie anwenden
  3. Bild nochmal kopieren und in Graustufen umwandeln (um die Helligkeit der Pixel auszuwerten)
  4. Objektfilter anwenden
    (sucht nach zusammenhängenden Pixeln, die nicht schwarz sind und analysiert diese)
  5. Objekte des Filters sortieren
    (wird schon vom Objektfilter übernommen, kann aber auch extern erledigt werden... für "Sonderwünsche")
  6. Die Werte des größten Objekts auslesen und dessen Werte auf das Bild der Kamera zeichnen
  7. 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.

Wer sich selbst austoben möchte, dem kann ich ein Blick in die Dokumentation empfehlen: www.aforgenet.com/framework/docs/

Download

zurück zum Index


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)
  • Dual-Webcam.zip
    Zu guter Letzt noch der Projektordner. Einfach endpacken und so... im Ordner bin/release/ ist eine Anwendung, die direkt gestartet werden kann (wenn man das Framework installiert hat...)

 

Zuletzt geändert am: May 02 2013 um 5:41 AM

Zurück