我通過網絡攝像頭捕獲視頻,該視頻給出了mjpeg流。 我在工作線程中做了視頻捕捉。 我開始捕獲這樣的:由於捕獲緩衝區導致OpenCV VideoCapture滯後
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);
相機是餵養在20fps的流。 但是,如果我不喜歡這20fps的閱讀:
if (!cap.isOpened()) return;
Mat frame;
cap >> frame; // get a new frame from camera
mutex.lock();
m_imageFrame = frame;
mutex.unlock();
然後有一個3+秒落後。 原因是捕獲的視頻首先存儲在緩衝區中。當我第一次啓動攝像機時,緩衝區會累積,但我沒有讀出幀。所以如果我從緩衝區讀取它總是給我舊的幀。 我現在唯一的解決方案是以30fps的速度讀取緩衝區,這樣可以快速清除緩衝區,並且沒有更嚴重的延遲。
是否有其他可能的解決方案,以便每次啓動相機時都可以手動清理/沖洗緩衝區?
爲什麼要限制到20fps?你在工作者線程中等待嗎? – mirosval
是緩衝你自己的一個或cv :: VideoCapture內的東西? – Micka
@ mirosval,是的,我這樣做,因爲我不想要太多的CPU ... – Nyaruko