OpenCV VideoWriter Framerate Issue
Estoy intentando grabar un video de una cámara web de 1080p en un archivo. Sostuve un temporizador en el video y en cada prueba la marca de tiempo reportada por un reproductor de video (VLC es lo que usé) no se sincroniza con la hora del video. Siempre está apagado unos segundos (generalmente el temporizador de video es más rápido que el tiempo informado por el jugador).
Como se ve a continuación, configuré el programa C ++ para capturar video en un hilo y grabar en otro hilo. Esto está funcionando bien ya que mi uso de CPU es de ~ 200% (¿máximo posible?). Estoy en un Macbook Air con OS X 10.8 a 1.8 GHz Intel Core i7.
He intentado cambiar la velocidad de cuadros a 15 fps y eso da como resultado un video muy lento / entrecortado. También he intentado establecerCV_CAP_PROP_FRAME_WIDTH
& CV_CAP_PROP_FRAME_HEIGHT
a una resolución menor y resulta en video lento. Parece que 1080p @ 30fps da como resultado un buen video estable, pero aún así se reproduce siempre más rápido de lo que se supone. También he intentado poner enwaitKey(10);
despuésrecord << frame;
Pero no afectó nada.
¿Alguna recomendación sobre cómo hacer que el video coincida a tiempo?
¡Gracias! 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;
}