首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于捕获缓冲区导致的OpenCV VideoCapture滞后

由于捕获缓冲区导致的OpenCV VideoCapture滞后
EN

Stack Overflow用户
提问于 2015-05-04 13:59:35
回答 6查看 92.1K关注 0票数 38

我是通过一个摄像头捕捉视频,它提供了一个mjpeg流。我在一个工作线程中拍摄了视频。我就这样开始抓捕:

代码语言:javascript
运行
复制
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);

摄象机正在以20 the的速度向溪流进发。但如果我在20 this读到这样的话:

代码语言:javascript
运行
复制
if (!cap.isOpened()) return;

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

        m_imageFrame = frame;
        mutex.unlock();

然后是一个3+秒延迟。原因是,捕获的视频首先存储在buffer.When中,我首先启动相机,缓冲区是累积的,但我没有读出帧。因此,如果我从缓冲区读取,它总是给我旧的框架。我现在唯一的解决方案是以30 lag读取缓冲区,这样它就可以快速清除缓冲区,并且没有更严重的滞后。

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

EN

Stack Overflow用户

发布于 2019-07-12 20:00:12

如果你知道你的相机的帧率,你可以使用这个信息(即每秒30帧)来抓取这些帧,直到你得到一个更低的帧速率。它之所以有效,是因为如果抓取功能变得延迟(即获得比标准帧速率更多的时间),这意味着缓冲区内的每一帧都需要等待下一帧才能从摄像机中获得。

代码语言:javascript
运行
复制
while(True):
    prev_time=time.time()
    ref=vid.grab()
    if (time.time()-prev_time)>0.030:#something around 33 FPS
        break
ret,frame = vid.retrieve(ref)
票数 -1
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30032063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档