Sto catturando video attraverso una webcam che fornisce un flusso mjpeg. Ho eseguito l'acquisizione video in un thread di lavoro. comincio la cattura in questo modo:OpenCV VideoCapture lag a causa del buffer di acquisizione
const std::string videoStreamAddress = "http://192.168.1.173:80/live/0/mjpeg.jpg?x.mjpeg";
qDebug() << "start";
cap.open(videoStreamAddress);
qDebug() << "really started";
cap.set(CV_CAP_PROP_FRAME_WIDTH, 720);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 576);
la fotocamera sta alimentando il flusso a 20fps. Ma se ho fatto la lettura di 20fps in questo modo:
if (!cap.isOpened()) return;
Mat frame;
cap >> frame; // get a new frame from camera
mutex.lock();
m_imageFrame = frame;
mutex.unlock();
Poi c'è un 3+ secondi ritardo. Il motivo è che il video catturato viene prima memorizzato in un buffer. Quando accendo la videocamera per la prima volta, il buffer si accumula ma non ho letto i fotogrammi. Quindi se leggo dal buffer mi dà sempre le vecchie cornici. L'unica soluzione che ho ora è quella di leggere il buffer a 30fps in modo che pulisca rapidamente il buffer e non ci sia lag più serio.
Esiste un'altra soluzione possibile in modo che sia possibile pulire/svuotare il buffer manualmente ogni volta che si avvia la fotocamera?
Perché si desidera limitare a 20 fps? Stai aspettando nel thread di lavoro? – mirosval
è quel buffer proprio o qualcosa all'interno di cv :: VideoCapture? – Micka
@ mirosval, sì, l'ho fatto perché non voglio troppo CPU ... – Nyaruko