Opencv aufgenommenes Video spielt zu schnell



  • Guten Morgen zusammen!

    ich weiß diesen Thread gab es in ähnlicher Form hier und in anderen Foren schon, allerdings funktionieren die Lösungen die dort vorgeschlagen wurden bei mir nicht, oder ich habe sie leider nicht richtig verstanden.

    Ich arbeite mit Visual Studio 2013 auf einem 32-Bit Windows 7 PC.
    Von OpenCV nutze ich die Version 2.4.12

    Das Problem ist wie im Titel kurz beschrieben:
    Ich versuche mit OpenCV ein Video aufzunehmen. Dieses soll mit einer beliebigen Kamera (im Test bisher nur die OnBoard Laptop Kamera) geschehen und ich muss die Framerate sehr reduzieren, um Datenmengen bei mehreren Stunden Aufzeichnungen zu verringern.

    Das Aufnehmen des Videos und Anzeigen des Bildes in einem Fenster funktioniert einwandfrei.
    Versuche ich allerdings das Video mit dem Windows Media Player abzuspielen ist es um ein vielfaches kurzer als die Aufnahme gedauert hat. Außerdem scheint es sehr unstabil zu sein, da es Bildfehler zeigt (was ich auf die viel zu hohe Abspielgeschwindigkeit schiebe).

    Zudem muss ich zugeben ist der Code aus einem Tutorial entnommen und nur leicht abgewandelt, weshalb ich denke, dass es funktionieren müsste.
    Auch ein Ändern der Frequenz im Videowriter hatte nicht den gewünschten Erfolg (außer dass die Kamera bei zu starken Abweichungen von ihrer Frequenz komplett auszusteigen scheint).

    Hier der verwendete Code:

    #include <iostream>
    #include "C:\opencv\build\include\opencv2\core\core.hpp"
    #include "C:\opencv\build\include\opencv2\highgui\highgui.hpp"
    
    using namespace cv;
    using namespace std;
    
    int CTJA::takeVideo(){
    	VideoCapture cap(0); // open the video camera no. 0
    
    	if (!cap.isOpened())  // if not success, exit program
    	{
    		cout << "ERROR: Cannot open the video file" << endl;
    		return -1;
    	}
    	namedWindow("MyVideo", CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"
    
    	double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
    	double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video
    
    	Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight));
    
    	VideoWriter oVideoWriter("MyVideo.avi", CV_FOURCC('P', 'I', 'M', '1'), 20, frameSize, true); //initialize the VideoWriter object 
    
    	if (!oVideoWriter.isOpened()) //if not initialize the VideoWriter successfully, exit the program
    	{
    		cout << "ERROR: Failed to write the video" << endl;
    		return -1;
    	}
    
    	while (1)
    	{
    
    		Mat frame;
    
    		bool bSuccess = cap.read(frame); // read a new frame from video
    
    		if (!bSuccess) //if not success, break loop
    		{
    			cout << "ERROR: Cannot read a frame from video file" << endl;
    			break;
    		}
    
    		oVideoWriter.write(frame); //writer the frame into the file
    
    		imshow("MyVideo", frame); //show the frame in "MyVideo" window
    
    		if (waitKey(1) == 27 || !Online) //wait for 'esc' key press for 30ms. If 'esc' key is pressed or main program not working anymore, break loop
    		{
    			cout << "esc key is pressed by user" << endl;
    			break;
    		}
    	}
    	cap.release();
    	oVideoWriter.release();
    	destroyAllWindows();
    }
    

    Bisher konnte ich auch noch nicht verstehen, wofür FourCC und die hier verwendeten Buchstaben stehen. Vielleicht kann mich an der Stelle auch jemand erhellen, auch wenn das -hoffe ich- nichts mit dem generellen Problem zu tun hat.

    Für eine schnelle Hilfe wäre ich sehr dankbar!

    Gruß



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    madabor schrieb:

    Bisher konnte ich auch noch nicht verstehen, wofür FourCC und die hier verwendeten Buchstaben stehen.

    Die stehen für GIDF.

    edit: Lol, einer der Top-Treffer ist das Tutorial, von dem du offensichtlich den Code übernommen hast. Bei dem das erklärt wird. Vielleicht solltest du das Tutorial auch lesen, anstatt nur blind Code zu übernehmen? Kein Wunder, dass du mit Codes aus anderen Foren Probleme hattest, wenn dies deine übliche Arbeitsweise ist. Programmieren bedeutet nicht, Code aus dem Internet neu zu arrangieren. Du musst verstehen, was du tust.



  • schnelle gute Hilfe...

    Ich weiß was hinter dem CODE steht, aber nicht was das auf Video Basis bedeutet.
    Mit Videos hatte ich einfach kaum etwas zu tun. Die Frage hätte allerdings vielleicht besser formuliert sein können.
    Ich bin davon ausgegangen das es sich um die Komprimierungsart des Videos handelt, was für mich unerheblich ist.
    Mittlerweile habe ich durch deinen netten Hinweis herausgefunden, dass doch ein paar mehr Inhalte damit einhergehen.

    Andere Beiträge haben mir nicht geholfen weil ich ein Problem mit dem VideoCodec direkt auseschlossen habe und dachte wenn der Codec nicht abspielbar ist, wird schon ein Fehler kommen. Das er einfach falsch abgespielt wird hatte ich nicht erwartet....

    Mit DIVX Codec läuft es auch. Allerdings tritt manchmal nach einigen Sekunden ein Fehler bei Waitkey auf...


Anmelden zum Antworten