Bilderfassung mit LabVIEW ohne NI-IMAQdx TEIL1

Industrielle und wissenschaftliche Bildverarbeitung ist eine Standardaufgabe mit LabVIEW. Für die Erfassung von Bildern stellt National Instruments für alle gängigen Kameraschnittstellen, wie zum Beispiel Firewire,  GigE Vision oder USB, den lizenzpflichtigen Treiber NI-IMAQdx bereit. Dieser Artikel beschreibt, wie man Bilder einer DirectShow kompatiblen Kamera erfassen kann, ohne NI-IMAQdx zu verwenden.

Für Bildverarbeitungsaufgaben in einem nicht-kommerziellen Bereich  oder für sehr einfache Anwendungen scheidet die Verwendung von NI-IMAQdx aufgrund der Lizenzkosten aus. Mit wenig Aufwand ist es möglich, eine  .NET Assembly zu erstellen, die DirectShow kompatible USB-Kameras, also fast jede Webcam, ansteuert und Bilder erfasst. Diese Assembly kann dann in LabVIEW mit Bordmitteln eingebunden werden. Für die Verteilung einer solchen Anwendung entstehen keine Lizenzkosten.

Vorweg sei noch gesagt, dass sich weder die hier zur Verfügung gestellte Bibliothek zur Bilderfassung noch USB-Kameras aus dem Elektromarkt für professionelle Anwendungen eignen. Wer ernsthaft Bildverarbeitung betreiben möchte, muss einige Tausender für eine Industriekamera in die Hand nehmen und damit sind die Lizenzkosten für den NI-IMAQdx Treiber nur noch Peanuts.

Grundlage der Assembly ist die Open Source DirectShow .NET Bibliothek. Diese Funktionssammlung stellt die Mittel bereit, um DirectShow in .NET Projekten zu verwenden.
Das mitgelieferte Beispiel DxSnap enthält bereits alles, was benötigt wird, um eine Kamera zu starten, das laufende Bild der Kamera als Vorschau zu zeigen und auf Knopfdruck ein einzelnes Bild zu erfassen. Ergänzt werden muss noch eine Möglichkeit zur Auswahl der Kamera, wenn nicht automatisch die erste Webcam im System genutzt werden soll.

Anlegen des Projekts

Zunächst muss ein Projekt in Visual Studio angelegt werden. Die unten angefügte Solution wurde mit Visual Studio 2008 erstellt.

Als Projekttyp muss Windows Forms User Control gewählt werden, damit die Assembly als .NET Bedienelement in LabVIEW eingebunden werden kann. Das User Control besteht nur aus einer PictureBox.

Die DirectShowLib-2005.dll muss als Reference zum Projekt hinzugefügt werden.

Liste der verfügbaren Geräte

Die Klasse des User Control benötigt eine öffentliche Eigenschaft mit einer Liste der verfügbaren DirectShow Geräte. Der Prefix wcc steht für „WebCam Control“.

public DsDevice[] wccDevices;

Die Liste enthält nach dem Erstellen des User Control Objekts noch keine Daten. Die Geräteliste wird mit einer öffentlichen Methode mit Daten gefüllt.

public void wccRefreshVideoDevices()
{
  wccDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
}

Das laufende Bild in der PictureBox anzeigen

Die Klasse des User Control besitzt eine private Eigenschaft für die Verbindung zur Kamera.

private Capture cam;

Mit der folgenden öffentlichen Methode wird die Anzeige des Bildes der ausgewählten Kamera (VideoDeviceIndex, zählt ab 0) in der PictureBox gestartet.

 public void wccSelectVideoDevice(int VideoDeviceIndex, int VideoWidth, int VideoHeight)
 {
  const int VIDEOBITSPERPIXEL = 24;
  cam = new Capture(VideoDeviceIndex, VideoWidth,
                    VideoHeight, VIDEOBITSPERPIXEL, pictureBox1);
 }

Erfassen eines Bildes

Der Code dieser Methode entspricht vollständig dem Beispiel-Code von DxSnap. Die Methode gibt ein Objekt mit dem .NET Datentyp Bitmap zurück. Natürlich muss diese Methode öffentlich sein.

public Bitmap wccGetBitmapHandle()
{
   // Release any previous buffer
   if (m_ip != IntPtr.Zero)
     {
       Marshal.FreeCoTaskMem(m_ip);
       m_ip = IntPtr.Zero;
     }

   // capture image
   m_ip = cam.Click();
   Bitmap b = new Bitmap(cam.Width, cam.Height, cam.Stride,
                         PixelFormat.Format24bppRgb, m_ip);

   // If the image is upsidedown
   b.RotateFlip(RotateFlipType.RotateNoneFlipY);            
   return b;
}

Der Pointer m_ip ist eine private Eigenschaften der User Control Klasse.

IntPtr m_ip = IntPtr.Zero;

Schließen der Referenzen

Vor dem Beenden des Programms sollten die geöffneten Referenzen freigegeben werden.

public void wccClose()
{
  cam.Dispose();
  if (m_ip != IntPtr.Zero)
   {
     Marshal.FreeCoTaskMem(m_ip);
     m_ip = IntPtr.Zero;
   }
}

Fazit

Mit den oben beschriebenen Methoden verfügt die Assembly, also die zu erstellende DLL, über die komplette Funktionalität zum Anzeigen des laufenden Bildes einer Webcam und zur Erfassung eines Einzelbildes.

Fast der gesamte hier gezeigte Code befindet sich bereits im Beispiel DxSnap und muss lediglich in eigene Methoden überführt werden. Kenntnisse zu DirectShow sind nicht einmal unbedingt erforderlich.

Das Beispiel DxSnap enthält weiteren Code, mit dem sich eine Methode zum Kopieren des Bildes in die Windows Zwischenablage oder ein Konfigurationsfenster für die Webcam realisieren läßt.

Die erste angefügte ZIP-Datei enthält die komplette Visual Studio 2008 Solution. Die zweite Datei enthält die erstellte Assembly und DirectShowLib-2005.dll zum Einbinden in LabVIEW.

Webcam Control VS2008 Projekt

Webcam Control nur DLL

Das Einbinden der Assembly in LabVIEW wird in Teil 2 dieses Artikels gezeigt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.