Webcam benutzen in C#
Wie steuert man am besten und einfachsten eine Webcam unter Benutzung von C#.Net an? Recherchiert man im Internet, wird man, sofern man überhaupt fündig wird, leider oftmals mit sehr langen Artikeln und unübersichtlichen Snippets konfrontiert. Doch das muss gar nicht sein, denn mit Hilfe der AForge.NET Library geht das ganz einfach. Und wie das genau geht, möchte ich euch im Folgenden Artikel zeigen.
Was wird für dieses Tutorial benötigt?
- Die AForge.Video.dll, sowie die AForge.Video.DirectShow.dll
Beide Dlls findet ihr auf der AForge Downloadseite im “(libs only)” zip-Archiv. - Eine schlichte WinForms-Anwendung, auf der ihr schon mal eine Picturebox anlegt.
Zuerst bindet ihr die beiden oben genannten Dlls als Referenzen ein. (Ich gehe an dieser Stelle einfach mal davon aus, dass ihr irgend eine Version des Microsoft Visual Studios für die Entwicklung nutzt. Bei anderen IDEs dürfte dieser Schritt jedoch ähnlich sein.)
Bevor wir zum Quellcode kommen, müsst ihr nur noch zwei Eventhandler anlegen. Einen für das FormLoad-Event und einen für das FormClosed-Event. (Am einfachsten geht dies direkt über den Designer des Visual Studios.)
Der Rest erklärt sich über den nachfolgenden Quelltext und dessen Kommentare.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//Anlegen von Using-Direktiven für einfacheren Zugriff auf die
//benötigten Methoden der AForge Library
using AForge.Video;
using AForge.Video.DirectShow;
namespace aforgeWebcamTutorial
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Anlegen eines Webcam-Objektes
VideoCaptureDevice videoSource;
private void Form1_Load(object sender, EventArgs e)
{
//Anlegen einer Liste mit allen Videoquellen. (Hier können neben der gewünschten Webcam
//auch TV-Karten, etc. auftauchen)
FilterInfoCollection videosources = new FilterInfoCollection(FilterCategory.VideoInputDevice);
//Überprüfen, ob mindestens eine Aufnahmequelle vorhanden ist
if (videosources != null)
{
//Die erste Aufnahmequelle an unser Webcam Objekt binden
//(habt ihr mehrere Quellen, muss nicht immer die erste Quelle die
//gewünschte Webcam sein!)
videoSource = new VideoCaptureDevice(videosources[0].MonikerString);
try
{
//Überprüfen ob die Aufnahmequelle eine Liste mit möglichen Aufnahme-
//Auflösungen mitliefert.
if (videoSource.VideoCapabilities.Length > 0)
{
string highestSolution = "0;0";
//Das Profil mit der höchsten Auflösung suchen
for (int i = 0; i < videoSource.VideoCapabilities.Length; i++)
{
if (videoSource.VideoCapabilities[i].FrameSize.Width > Convert.ToInt32(highestSolution.Split(';')[0]))
highestSolution = videoSource.VideoCapabilities[i].FrameSize.Width.ToString() + ";" + i.ToString();
}
//Dem Webcam Objekt ermittelte Auflösung übergeben
videoSource.DesiredFrameSize = videoSource.VideoCapabilities[Convert.ToInt32(highestSolution.Split(';')[1])].FrameSize;
}
}
catch { }
//NewFrame Eventhandler zuweisen anlegen.
//(Dieser registriert jeden neuen Frame der Webcam)
videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(videoSource_NewFrame);
//Das Aufnahmegerät aktivieren
videoSource.Start();
}
}
void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
//Jedes ankommende Objekt als Bitmap casten und der Picturebox zuweisen
//(Denkt an das ".Clone()", um Zugriffsverletzungen aus dem Weg zu gehen.)
pictureBoxVideo.BackgroundImage = (Bitmap)eventArgs.Frame.Clone();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
//Beim Beenden des Programmes die Webcam wieder "freigeben",
//damit sie von anderen Anwendungen benutzt werden kann.
if (videoSource != null && videoSource.IsRunning)
{
videoSource.SignalToStop();
videoSource = null;
}
}
}
}
Ich hoffe, dass ihr nun auch im Stande seit, erfolgreich Webcams und andere Videoaufnahmequellen unter C# zu verwenden.
Solltet ihr noch Fragen, Anregungen oder Kritik haben, so schreibt mir doch einfach einen Kommentar.
Viele Grüße,
Raffi

Vielen Dank. Das Beispiel hat mir sehr geholfen. Es wäre schön wenn eine Anleitung über Bilderkennung folgen würde.
Was genau möchtest du denn erkennen? Objekte? Bewegungen? Oder Inhalte, die ausgewertet werden sollen? (Sowas wie Texte z.B.)
Und genügt es am Einzelbilder oder möchtest du das gerne am Livebild/Stream der Webcam umsetzen?
Viele Grüße,
Raffi
Hey ho, hab da mal ne Frage. Ich würd gerne AForge für die Bilderkennung nutzen, hab aber leider keine Ahnung wie ich ran gehen soll. Habe bereits ein paar .dlls eingeladen und versuche nun deren Funktione zu nutzen. Ich muss dazu sagen, dass ich fast noch ein Neuling auf diesem Gebiet bin … Realisiert habe ich das Ganze schon auf Matlab. Aber mit C# tue ich mich gerade echt schwer.
Vielen Dank für die Hilfe
Hast du es geschafft meine Anleitung umzusetzen? Eigentlich sollte das klappen, wenn du sie Schritt für Schritt befolgst.
Wenn es dir um das einbinden generell geht. Binde die dlls so ein, wie ich es hier im Post beschrieben habe. Um dann deren Funktionen zu nutzen, tippe einfach mal den Namen der Dll. Das Intellisense vom Visual Studio sollte dir da behilflich sein. Nachdem du den richten Namen getippt hast, mache einen Punkt dahinter. Nun solltest du alle Klassen/Methoden sehen, die diese DLL enthält und auf die du zugreifen kannst.
Wenn dir das immer noch nicht weiter hilft, könnte ich dir noch anbieten, dass du mir den entsprechenden Quellcode-Ausschnitt mal zukommen lässt. Dann werfe ich mal einen Blick drauf.
Ansonsten ist http://www.mycsharp.de auch immer eine gute Anlaufstelle bei Fragen rund um C#. ;)
Viele Grüße,
Raffi
[...] all jene, die noch nicht so lange dabei sind – Christoph bezieht sich auf folgenden Artikel. Aber nun zu seinem Problem. Wie bindet man Dlls im Visual Studio in ein laufendes Projekt [...]