OpenCV VideoWriter-Framerate-Problem
Ich versuche, Videos von einer 1080p-Webcam in eine Datei aufzunehmen. Ich habe einen Timer im Video hochgehalten und in jedem Versuch stimmt der von einem Videoplayer gemeldete Zeitstempel (VLC wurde von mir verwendet) nicht mit der Zeit im Video überein. Es ist immer ein paar Sekunden lang ausgeschaltet (normalerweise ist der In-Video-Timer schneller als die vom Player gemeldete Zeit).
Wie unten gezeigt, habe ich das C ++ - Programm so eingerichtet, dass Videos in einem Thread aufgenommen und in einem anderen Thread aufgenommen werden. Dies funktioniert gut, da meine CPU-Auslastung ~ 200% beträgt (maximal möglich?). Ich verwende ein Macbook Air mit OS X 10.8 und 1,8 GHz Intel Core i7.
Ich habe versucht, die Framerate auf 15fps zu ändern, was zu sehr ruckeligen / langsamen Videos führt. Ich habe auch versucht, Einstellungen vorzunehmenCV_CAP_PROP_FRAME_WIDTH
& CV_CAP_PROP_FRAME_HEIGHT
zu einer niedrigeren Auflösung und es ergibt sich ein langsames Video. Es sieht so aus, als ob 1080p @ 30fps für ein stabiles Video sorgen, es wird jedoch immer schneller wiedergegeben, als es eigentlich sein sollte. Ich habe es auch versuchtwaitKey(10);
nach demrecord << frame;
aber es hat nichts beeinflusst.
Gibt es Empfehlungen, wie das Video rechtzeitig angepasst werden kann?
Vielen Dank! Aakash
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <boost/thread.hpp>
using namespace cv;
void captureFunc(Mat *frame, VideoCapture *capture){
for(;;){
// get a new frame from camera
(*capture) >> (*frame);
}
}
int main(int, char**)
{
VideoCapture capture(0); // open the default camera
if( !capture.isOpened() ) {
printf("Camera failed to open!\n");
return -1;
}
capture.set(CV_CAP_PROP_FPS,30); //set capture rate to 30fps
Mat frame;
capture >> frame; // get first frame for size
// initialize recording of video
VideoWriter record("test.avi", CV_FOURCC('D','I','V','X'), 30, frame.size(), true);
if( !record.isOpened() ) {
printf("VideoWriter failed to open!\n");
return -1;
}
boost::thread captureThread(captureFunc, &frame, &capture); //start capture thread
sleep(1); //just to make sure capture thread is ready
for(;;)
{
// add frame to recorded video
record << frame;
}
return 0;
}