Bilderfassung mit LabVIEW ohne NI-IMAQdx TEIL2

Ich stelle eine Bibliothek zum Erfassen von Bildern einer USB Webcam mit LabVIEW ohne NI-IMAQdx in diesem Artikel vor. In Bilderfassung mit LabVIEW ohne NI-IMAQdx TEIL1 wurde eine auf der DirectShow .NET Bibliothek basierende .NET Assembly erstellt, die die Funktionalität bereitstellt. Hier wird das Einbinden dieser .NET DLL in LabVIEW gezeigt.

Die .NET Assembly

Die .NET Assembly enthält folgende relevante Eigenschaften und Methoden:

  • wccDevices (Eigenschaft)
    Array vom Datentyp DsDevice mit Referenzen auf die im System vorhandenen DirectShow Video-Geräte
  • wccRefreshVideoDevices (Methode)
    aktualisiert die Liste wccDevices
    Parameter: keine
    Rückgabewert: keiner
  • wccSelectVideoDevice (Methode)
    Startet die Anzeige des laufenden Bildes im .NET Bedienelement
    Parameter:

    • int VideoDeviceIndex: LabVIEW I32, ist der Index für das DirectShow Video-Gerät, das gestartet werden soll. Fängt bei 0 an und geht bis zur Länge minus 1 vom Array wccDevices
    • int VideoWidth: LabVIEW I32, Breite des aufzunehmenden laufenden Bildes, nur mit der Angabe 640 getestet
    • int VideoHeight: LabVIEW I32, Höhe des aufzunehmenden laufenden Bildes, nur mit der Angabe 480 getestet

    Rückgabewert: keiner

  • wccGetBitmapHandle (Methode)
    Erfasst ein Bild der Kamera und gibt die Bitmap zurück
    Parameter: keine
    Rückgabewert: Bitmap (.NET Datentyp)
  • wccClose (Methode)
    Schließt interne Referenzen der Assembly
    Parameter: keine
    Rückgabewert: keiner

LabVIEW Wrapper Bibliothek „Webcam Control“

Die oben beschriebenen Funktionen der DLL WebcamControlDirectShowNet müssen nur noch in eine LabVIEW Bibliothek eingebaut werden, damit sie auf einfache Weise benutzt werden können.

Webcam Control.ctl

Webcam Control Bedienelement im BlockdiagrammDies ist das Bedienelement, dass das laufende Bild der Webcamm anzeigt. Es handelt sich um das LabVIEW Bedienelement „.NET Container“, dem die DLL WebcamControlDirectShowNet zugewiesen wurde. Der Referenzausgang wird für alle anderen VIs der Bibliothek benötigt.

Initialize.vi

Symbol von Initialize.viDie DLL WebcamControlDirectShowNet wird durch das oben beschriebene Bedienelement Webcam Control in den Speicher geladen.  WebcamControlDirectShowNet.dll benötigt zum Funktionieren die DLL DirectShowLib-2005, die durch einen LabVIEW .NET Kontruktorknoten in Initialize.vi geladen wird.

Kontrukturknoten um DirectShowLib-2005.dll zu laden

Konstruktorknoten um DirectShowLib-2005.dll zu laden

List Devices.vi

Symbol von List Devices.viDiese VI dient dazu, ein Array mit den Namen der DirectShow Video-Geräte im System zu erhalten. Zunächst wird die Methode wccRefreshVideoDevices aufgerufen und dann die Eigenschaft wccDevices gelesen. wccDevices ist ein Array vom DirectShowLib Datentyp DsDevice. Mit der Eigenschaft „Name“ von DsDevice kommt man an den Gerätenamen als String.

Blockdiagramm von List Devices.vi

Blockdiagramm von List Devices.vi. Hier werden die Namen der Video-Geräte im System ermittelt.

 Start Preview.vi

Symbol von Start Preview.viStart Preview.vi startet den Zugriff auf die ausgewählte Webcam und zeigt deren laufendes Bild im Webcam Control auf dem FrontPanel an. Die Auswahl des Video-Geräts basiert auf dem Index des Ausgabearrays von List Devices.vi. Intern wird die Methode wccSelectVideoDevice aufgerufen.
Nachdem eine Webcam gestartet wurde ist ein wechsel des Video-Geräts zur Laufzeit des VIs nicht mehr möglich.

Blockdiagrammausschnitt von Start Preview.vi

Blockdiagrammausschnitt von Start Preview.vi. Eine über den VideoDeviceIndex vorgegebene Webcam wird damit gestartet.

Get Image from Memory.vi

Symbol von Get Image from Memory.viMit diesem Modul wird ein Bild von der Webcam erfasst, aus dem Arbeitsspeicher geladen und in LabVIEW mit dem Datentyp Image (Grafik) zur Verfügung gestellt.
Intern wird die Methode wccGetBitmapHandle aufgerufen, die eine .NET Bitmap zurück gibt. Die .NET Klasse System.Drawing.Bitmap enthält die Methode GetHbitmap, die die Speicherstelle der Bitmap verrät. Mit dem im Artikel Hbitmap Handle mit LabVIEW lesen vorgestellten VI bekommt man das Bild vom LabVIEW-Datenyp Image.

Blockdiagramm von Get Image From Memory.vi

Blockdiagramm von Get Image From Memory.vi. Zunächst wird eine .NET Bitmap Referenz geholt, die dann aus dem Speicher gelesen wird.

Save Image to File.vi

Symbol von Save Image to File.viSave Image to File ist sozusagen die Schwester von Get Image from Memory. Ein Bild der Webcam wird erfasst und im ausgewählten Format auf der Festplatte gespeichert.
Auch in diesem VI wird wccGetBitmapHandle aufgerufen. Die .NET Klasse System.Drawing.Bitmap enthält die Methode „Save“, die das Bild direkt auf die Festplatte speichert.

Blockdiagramm von Save Image to File.vi

Blockdiagramm von Save Image to File.vi. Die Klasse System.Drawing.Bitmap enthält eine Methode zum Speichern.

Close Webcam Control.vi

Symbol von Close Webcam Control.viDieses VI schließt Referenzen. Intern wird die Methode wccClose aufgerufen.

Blockdiagramm von Close Webcam Control.vi

Blockdiagramm von Close Webcam Control.vi.

Referenz Design

Symbol von Reference Design.viDieses Referenzdesign zeigt die Anwendung der Bibliothek mit einem Master/Slave Entwurfsmuster. Außerdem wird das hier nicht vorgestellte VI „Show Device Settings Window“ zur Manipulation von Kameraparametern benutzt.

VI Snippet von Webcam Control Reference Design.vi

Fazit

Mit der LabVIEW Bibliothek „Webcam Control“ steht eine einfache und lizenzfreie Möglichkeit bereit, Bilder von einer Webcam anzuzeigen und zu erfassen. Die Fähigkeiten der Bibliothek sind jedoch auf einfache Anwendungsfälle begrenzt, denn die Abtastrate zum Erfassen liegt bei etwa einer Sekunde. Die Bibliothek ist daher im professionellen Bereich kein Ersatz für NI-IMAQdx.

Bibliothek als ZIP-Dateien zum Laden

Natürlich stelle ich gerne den LabVIEW 2011 Code zum Herunterladen bereit.

Webcam Control Projekt mit Reference Design (und Webcam Control Bibliothek)

LabVIEW Webcam Control Bibliothek (nur die Bibliothek ohne Reference Design)

Achtung! Das Entpacken der zip-Dateien mit dem Windows Explorer kann auf manchen Rechnern die enthaltenen DLL-Dateien beschädigen und diese unbrauchbar machen. Bitte verwenden Sie ein anderes Programm zum Entpacken, zum Beispiel das kostenlose 7-Zip.

Update: Die Webcam Control Bibliothek  ist mit Windows 8 und LabVIEW 2013 kompatibel. Sie können das Projekt als 7-Zip für LabVIEW 2013 laden:

Webcam Control Projekt mit Reference Design, LabVIEW 2013, 7-Zip Paket

13 Gedanken zu „Bilderfassung mit LabVIEW ohne NI-IMAQdx TEIL2

  1. Ein sehr gut gemachter Beitrag, didaktisch hervorragend präsentiert !
    Ich habe diesen Beitrag nach längerem Suchen gefunden. Es erspart mir wahrscheinlich wochenlanges herumtüftelt. Ich kann mich nun voll und ganz meiner eigentlichen Aufgabe (folge dem gelben Kreis) widmen.

    DANKE

  2. Herzlichen Dank für die Anleitung und die Bibliothek. Nach einer Woche tüfteln mit der avicap.dll und user32.dll scheint mir die hier präsentierte Lösung die schönste zu sein.

  3. Schön wär’s gewesen… ;-(

    Die Webcams werden korrekt erkannt aber das „Start Preview.vi“ bricht mit folgender Meldung ab:

    Error 1172 occurred at Invoke Node Error calling method WebcamDirectShowNet.WebcamControl.wccSelectVideoDevice, (System.Runtime.InteropServices.COMException: No combination of intermediate filters could be found to make the connection.)

    …auf Windows 7 (64bit) mit LabVIEW 2013 (32bit).

    Gruss, Thomi

  4. Das ist echt ein klasse Tool hab jetzt nur ein Üroblem würde gern einen teilausschnitt der Kamera nehmen und den grün markieren und weiter geben.
    Hab leider keine ahnung von .net und hab gestern 8 stunden versucht das hinzubekommen ein kleiner Tip wäre schon hilfreich :-).

  5. Am einfachsten ist es, den Bildausschnitt nicht beim Erfassen zu wählen, sondern in LabVIEW einen Ausschnitt des gesamten bereits erfassten Bildes zu verarbeiten. Dann sind keine Anpassungen in .NET notwendig und die Bibliothek kann so verwendet werden, wie sie ist. In LabVIEW das mitgelieferte VI „Bildausschnitt lesen“ (Get Image Subset) benutzen.

  6. Bei mir funktioniert das nicht. 🙁
    Ich bekomme immer den Fehler „LabVIEW: The specified .NET class is not available in LabVIEW.“
    Was mache ich falsch?

  7. Das sieht sehr interessant aus!
    Leider kann ich mir die VIs nicht angucken, da ich eine 2012 Version habe.
    Ich würde mich sehr über eine kompatibel abgespeicherte Version freuen!

  8. Danke für den Kommentar. Es ist nicht geplant, den Code für alte LabVIEW Versionen bereitzustellen. Ich denke, eine Aktualisierung auf LV 2013 ist jedem zuzumuten. Es reicht die Eval-Version, um den Code zu öffnen und für 2012 abzuspeichern.

  9. Vielleicht liegt es an der installierten .NET Version? Ich schlage vor, auf .NET 4.5 zu aktualisieren.

  10. Sehr schönes Programm und Erklärung. Nur klappt es bei mir nur mit der internen Kamera des Laptops. Bei der externen (Hercules classic link) erscheint leider die Fehlermeldung 1172. Hat jemand mit einer günstigen Webcam gute Erfahrung gemacht und teilt mir dieses mit?

  11. Das ist genau, was ich gesucht habe.
    Konnte das Projekt auch erfolgreich in Betrieb nehmen.
    Ich hatte dabei folgende Probleme umschiffen müssen.

    Entwicklungssystem: LabVIEW 2013 SP1 auf XP/32-Bit
    Zielsysteme: XP/32-Bit und WIN7/64-Bit

    Entwicklungssystem:
    Wenn ich das Projekt vom Netzlaufwerk öffne und das Start-VI lade, kann die .NET-Klasse im LabVIEW Bedienelement “.NET Container”, nicht geladen werden werden.
    Verschiebe ich das ganze Projekt auf das lokale Laufwerk, ist das Problem weg.

    Der Error 1172 mit den „nicht gefunden Filtern“, tauchte bei mir ebenfalls auf.
    Habe dann verschiedene Kombinationen der Videoauflösungen für das ‚Start Preview.vi‘ versucht. Siehe da, es geht dann.
    Evtl. hilft auch eine Installation von Video-Codecs. –> Google

    Installation der EXE auf XP/32-Bit:
    – Läuft sofort.

    Installation der EXE auf WIN7/64Bit:
    – Mehrere Fehlermeldungen, unter anderem, dass .NET 4 erwartet wird.
    (Auf WIN7 ist 4.5 installiert)
    .NET 4.0 installiert und es läuft.

    Habe folgende Kamera verwendet:
    – LOGITECH C615 HD Webcam, ohne Verwendung von LOGITECH-Treiber CD

    Gruß Peter

  12. Vielen Dank! Hat mir sehr viel Zeit erspart.

    Ein Verbesserungsvorschlag: (ist viel schneller!!!)
    In „Get HBitmap.vi“ den for loop mit folgendem code ersetzen: „Split Number.vi“ (aus U32 mach 2 mal U16), jedes der U16 in U8 splitten, dann nur noch die 3 U8 (Hi-Lo, Lo-Hi & Lo-Lo -> Hi-Hi wird nicht gebraucht) mit „Interleave 1D Arrays.vi“ zusammenfügen.

    Was noch schön wäre:
    Liste der verfügbaren Video Modes (analog zu wccDevices), damit man sieht, welche Komprimierfilter und Auflösungen man wählen kann. Natürlich muss man dann den Filter auch noch wählen können bei „Start Preview.vi“

    Gruss
    Damian

Schreibe einen Kommentar

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