Implementieren einer WebCam in einer WPF-App mit AForge.Net

8

Ich schreibe eine WPF-Anwendung, wo ich einen Webcam-Feed anzeigen muss. Ich konnte dies mit dem AForge Framework leicht machen. Aber wenn ich von einem Computer zu einem anderen Computer gewechselt habe, funktioniert der gleiche Code nicht auf die gleiche Weise.

In der ersten funktioniert der Webcam-Feed einwandfrei, in der anderen jedoch nicht, der Feed hat viel Verzögerung und die Anwendung funktioniert nicht richtig.

Hier ist der Code:

%Vor%

Was dieser Code wirklich einfach ist, bekommt er einen neuen_Frame von der Webcam in Form eines Bitmap , und was ich tun muss, ist es in ein BitmapSource zu konvertieren, damit ich es im Bild anzeigen kann von der WPF. Ich denke, diese Konvertierung ist verantwortlich für das Chaos, das passiert, aber ich verstehe nicht, warum es in einem Computer funktioniert und in der anderen nicht.

Die Computer-Spezifikationen sind fast identisch, der Prozessor ist derselbe wie der Systemspeicher.

Mein Problem hier ist Leistung , dieser Code in einem Computer läuft reibungslos, und der Webcam-Feed wird präsentiert, wie es sollte, wenn ich es auf einen anderen PC portiere, passiert das nicht. p>     

João Cardoso 05.01.2010, 12:47
quelle

4 Antworten

18

Hier ist der Arbeitscode basierend auf dieser Artikel.

(1) Laden Sie das letzte AForge-Framework herunter und installieren Sie es . (Ich habe Version 2.2.4 verwendet)

(2) Erstellen Sie ein WPF-Anwendungsprojekt.

(3) Fügen Sie Verweise auf diese AForge-DLLs hinzu. (Sie finden sie im Ordner C: \ Programme (x86) \ AForge.NET \ Framework \ Release, d. H.)

(4) Erstellen Sie Ihr Projekt. (Ich habe VS 2012 verwendet)

(5) Fügen Sie WPF Image control hinzu und nennen Sie es "frameHolder".

Sie haben also etwas wie

%Vor%

(6) Fügen Sie den C # -Code hinzu:

%Vor%

////

%Vor%

(7) Re-Build-Projekt und es funktioniert!

Hinweis: Wir verwenden standardmäßig die zuerst erkannte WebCam. Stellen Sie sicher, dass der WebCam-Treiber installiert ist und WebCam im Allgemeinen funktioniert ...:)

    
Academy of Programmer 08.02.2013 18:39
quelle
2

In meinem WPF MediaKit habe ich ein Steuerelement namens VideoCaptureElement, das eine Webcam für WPF rendert. Sie können auch auf die Beispiele zugreifen, indem Sie sich in das neue Bildereignis einklinken und EnableSampleGrabbing für das Element festlegen.

    
Jeremiah Morrill 05.01.2010 16:40
quelle
2

Ich weiß, dass der ursprüngliche Beitrag über drei Jahre alt ist, aber ich habe gerade versucht herauszufinden, wie man diesen Code benutzt. Ich fand, dass die Antwort von Dimi fast ein voll funktionsfähiger Code ist. Ich habe jedoch festgestellt, dass ich Probleme mit dem Speicherverlust habe und der Frame auf einigen Computern nicht zuverlässig gerendert wird. Der Code funktionierte perfekt auf meinem leistungsstärkeren Entwicklungscomputer (i7, 16GB RAM, Quadro Pro Grapthics-Karte), aber als ich die App auf einem Computer mit begrenzten Ressourcen (i5, 4GB RAM, integrierte Intel-Grafik) entfaltete, verschwand der Rahmen einmal eine Weile und das Programm würde auch abstürzen, nachdem der Systemspeicher abgelaufen ist. Nachdem ich eine Weile im Internet gesucht habe, habe ich endlich einen Arbeitscode zusammengeflickt, der auf all dem Feedback basiert, das die Leute hatten. Ich weiß, dass der andere Computer Frame-Capture von der Webcam ausführen kann, da ich eine WinForm C # -App habe, die ich mit AForge.NET geschrieben habe, und es hat keine Probleme, den Frame zuverlässig und ohne Speicherverlust zu rendern. Leider behandelt WPF Graphics nicht so wie WinForm und wir müssen diesen Hack machen, damit AForge.NET damit arbeiten kann.

Grundsätzlich entspricht der Code dem von Dimi mit Ausnahme der Methode Cam_NewFrame.

%Vor%

Die vorgenommenen Änderungen sind folgende:

  1. Einschließen der Bitmap-Behandlung mit Using scope, so dass ungenutzter Speicher sofort nach dem Ende des Bereichs bereinigt wird.
  2. Verschieben Sie die Datei bi.BeginInit (), bevor Sie mit dem Speicher-Stream arbeiten, so dass die Bitmap sofort für den Memomory-Dump bereit ist.
  3. Ändern der CacheOption auf OnLoad, so dass der gesamte Bildspeicher direkt beim Laden abgemagert wird. Andernfalls wird BitmapCacheOption.Default verwendet, wodurch das Image auch dann im Speicher gehalten werden kann, wenn bi.Freeze () ausgegeben wird. Dies führte dazu, dass der Frame nicht gerendert wurde, obwohl der Dispatcher.BeginInvoke aufgerufen wurde, um das Image zu rendern.

Bisher hat es gut geklappt, aber wenn jemand andere Probleme entdeckt, machen Sie bitte einen Kommentar, damit wir wissen, wie wir ihn beheben können.

    
Patratacus 27.01.2017 14:10
quelle
-1

Vielleicht ist die Webcam auf dem anderen Computer kaputt / fehlerhaft? Oder hat eine der Webcams, die die DirectShow-API nicht unterstützt, von der ich denke, dass AForge darauf baut.

    
Kurru 09.01.2010 18:29
quelle

Tags und Links