2016-05-23 8 views
1

Ich bin neu im Forum. Ich habe vor ein paar Wochen mit Opencv mit Java begonnen. In meinem Programm verwende ich Videocapture, um Frames aus einer AVI-Datei zu lesen. Gestern habe ich bemerkt, dass der n-te Frame, der aus der Datei gelesen wird, sich von verschiedenen anderen Runs meines Programms unterscheidet, als derselbe n-te Frame, der in einem vorherigen Durchlauf aus der gleichen Datei gelesen wurde. Ich habe dies bestätigt, indem ich zwei Kopien desselben Frames subtrahiere, nachdem ich die Videoaufnahme auf dieselbe Bildnummer zurückgesetzt habe. Ist das zu erwarten, oder mache ich etwas falsch? Hier ist der Code:videocapture liest den gleichen Frame unterschiedlich auf mehrere Anrufe

/*==========================*/ 
for (int j = 0; j < 100; j++){ 
    Mat img = new Mat(); 
    Mat m1 = new Mat(); 
    Mat m2 = new Mat(); 

    VideoCapture vc = new VideoCapture(filename); 
    vc.set(Videoio.CAP_PROP_POS_FRAMES, 0); 
    for (int i = 0; i < 9; i++) vc.grab(); 
    vc.read(img); 
    m1 = img.clone(); 
    Imgproc.cvtColor(m1, m1, Imgproc.COLOR_BGR2GRAY); 
    vc.release(); 

    vc = new VideoCapture(filename); 
    vc.set(Videoio.CAP_PROP_POS_FRAMES, 0); 
    for (int i = 0; i < 9; i++) vc.grab(); 
    vc.read(img); 
    m2 = img.clone(); 
    Imgproc.cvtColor(m2, m2, Imgproc.COLOR_BGR2GRAY); 
    vc.release(); 

    Mat m3 = new Mat(); 
    Core.absdiff(m1, m2, m3); 

    if (Core.countNonZero(m3) > 0)System.out.println(Core.sumElems(m3)); 
} 
/*==========================*/ 

In diesem Code Ich bin an nur das erste Bild aus dem Video extrahieren. Die "Grab" -Rufe befinden sich in den beiden inneren Loops, um sicherzustellen, dass der Frame-Buffer im VideoCapture-Objekt erschöpft ist. In meinem Fall ist die Puffergröße 9, obwohl ich mir nicht sicher bin, warum das so ist. Die äußere Schleife dient lediglich dazu, das gesamte Programm mehrmals zu testen. Die Ausgabe von System.out ist gelegentlich ungleich Null, zum Beispiel 5-6 mal über die 100 Schleifeniterationen. Stattdessen würde ich erwarten, dass es immer Null ist, da das Programm im Wesentlichen das gleiche erste Bild zweimal liest und als solches die Ausgabe des Absdiffs Null sein sollte.

+1

Was passiert, wenn Sie alle '.grab()' Aufrufe entfernen? Kannst du versuchen, ein 2. VideoCapture zu verwenden? Ist deine Datei ein Video? Hat es eine spezielle Codierung? Wenn ja, ist der erste Frame ein Keyframe? Können Sie die Eingabe bereitstellen? – Micka

+0

Wenn ich die .grab durch .read ersetzen, habe ich immer noch das gleiche Problem. Ich benutze effektiv eine zweite Videoaufnahme, wie ich die erste und die Zuweisung einer neuen veröffentlichen. Das Video, das ich verwende, ist das zweite aus der Liste: ftp://motinas.elec.qmul.ac.uk/pub/iLids/ Ich bin mir nicht sicher, ob der erste Frame ein K-Frame ist, aber das gleiche Problem ist vorhanden, auch wenn ich die 2., 3. usw. lese ... – gaetano

Antwort

0

Es scheint, ich habe eine Lösung für mein Problem gefunden, obwohl ich noch nicht sicher bin, ob das der richtige Weg ist, um das zu lösen: Ich habe die Datei "opencv_ffmpeg310_64.dll" aus dem Opencv Build Bin-Ordner in meine Eclipse kopiert Projekt. Jetzt ist der Unterschied der beiden Frames in der Tat immer Null.

Als ich den Leitfaden auf der Opencv-Website über die Integration von Opencv in Eclipse befolgt habe, wird nirgends erwähnt, dass auch diese DLL enthalten ist.

... jetzt frage ich mich, wie Opencv ohne diese DLL in erster Linie ohne einen Fehler noch Ausnahme zu verwalten? Ich bin sicher, dass ich keine anderen Installationen von ffmpeg auf meinem PC habe. Irgendwelche Gedanken dazu?

Verwandte Themen