相关疑难解决方法(0)

由于捕获缓冲区,OpenCV VideoCapture滞后

我正在通过网络摄像头捕获视频,该网络摄像头提供了一个mjpeg流.我在工作线程中进行了视频捕获.我像这样开始捕获:

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);
Run Code Online (Sandbox Code Playgroud)

摄像机以20fps的速度输入流.但是,如果我像这样以20fps读取:

if (!cap.isOpened()) return;

        Mat frame;
        cap >> frame; // get a new frame from camera
        mutex.lock();

        m_imageFrame = frame;
        mutex.unlock();
Run Code Online (Sandbox Code Playgroud)

然后有3秒多的延迟.原因是捕获的视频首先存储在缓冲区中.当我第一次启动摄像机时,缓冲区被累积但我没有读出帧.所以如果我从缓冲区读取它总是给我旧帧.我现在唯一的解决方案是以30fps的速度读取缓冲区,这样它就可以快速清理缓冲区并且没有更严重的延迟.

有没有其他可能的解决方案,以便每次启动相机时我都可以手动清理/刷新缓冲区?

c++ video opencv

21
推荐指数
2
解决办法
4万
查看次数

标签 统计

c++ ×1

opencv ×1

video ×1