none
MotionDetection und Videoaufnahme mit Accord (Aforge) und emgu.cv (OpenCV)

    Allgemeine Diskussion

  • Hallo,
    ich habe ein kleines WPF-C#- Projekt, welches den Stream einer IP-Kamera anzeigt, Bewegung auswertet, Bilder und Videos aufzeichnet. Ähnlich wie iSpy, nur viel einfacher. Dazu nehme ich Accord, ein Aforge Clon. Den Stream liefert eine einfache USB- Webcam, die an einem Raspberry Pi 1 hängt übers WLAN. Dort ist fforge installiert und stellt einen mpeg-Stream bereit.

    Genutzt wird die Anwendung um mit MotionDetection eine Bewegung zu erkennen und dann für ein paar Sekunden ein Video aufzeichnet und/oder im Sekundentakt ein paar Bilder abspeichert.

    Lediglich mit dem VideoFileWriter, der zu Accord.Video.FFMPEG gehört, habe ich zwei Probleme:

    zum einen wirft mir dieser sporadisch folgenden Fehler, der leider nicht mit Try/Catch abgefangen werden kann und ich nicht dahinter komme was schief läuft:

    System.AccessViolationException
      HResult=0x80004003
      Nachricht = Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
      Quelle = <Die Ausnahmequelle kann nicht ausgewertet werden.>
      Stapelüberwachung:
    <Die Ausnahmestapelüberwachung kann nicht ausgewertet werden.>
    Mit sporadisch meine ich, das es stundenlang problemlos läuft und Videos aufzeichnet, bis etwas passiert, was ich noch nicht geblickt habe. 


    zum anderen funktioniert das Programm nicht, wenn ich es auf einem anderen Rechner starte. Ich habe sämtliche DLL's mitgenommen. Also das Programm startet, es wird lediglich kein Bild angezeigt. Sobald ich folgenden Code auskommentiere, der für das aufnehmen eines Videos zuständig ist, funktioniert alles (bis auf das Video aufnehmen natürlich).
    if (firstFrameTime != null)
    {
    	writer.WriteVideoFrame(eventArgs.Frame, DateTime.Now - firstFrameTime.Value);
    }
    else
    {
    	writer.WriteVideoFrame(eventArgs.Frame);
    	firstFrameTime = DateTime.Now;
    }
    Der Teil wird in "private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)" aufgerufen, ein Callback welches gefeuert wird, sobald ein neuer Frame ansteht.

    Prinzipiell verwende ich MVVMlight, der obige Code steckt im Viewmodel.



    Mittlerweile habe ich emgu.cv implementiert. Ein OpenCV Wrapper für .NET
    Das funktioniert alles sehr gut. Bis auf den Punkt, das meine Anwendung jetzt relativ viel CPU Last erzeugt, permanent 35% Auslastung. Gegenüber Accord (Aforge), erzeugt nur ca. 15% CPU Last, ist das recht viel.


    Ich habe das hier mal als Diskussion eingestellt, da es sich um ein privates Programm handelt, kein Druck dahintersteckt und mich eure Meinung zu den "Problemen" interessiert und ob schon jemand ähnliche Erfahrungen mit diesen Lib's gemacht hat.

    Gruß

    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 13. Juni 2018 18:50

Alle Antworten