相关疑难解决方法(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万
查看次数

如何从opencv [python]中的捕获设备(相机)获取最新帧

我想连接到相机,并且只在事件发生时捕获帧(例如按键).我想做的简化版本是这样的:

cap = cv2.VideoCapture(device_id)

while True:
    if event:
        img = cap.read()
        preprocess(img)

    process(img)
    cv.Waitkey(10)
Run Code Online (Sandbox Code Playgroud)

但是,cap.read似乎只捕获队列中的下一帧,而不是最新的帧.我在网上做了很多搜索,似乎有很多问题,但没有明确的答案.只有一些脏的黑客涉及在抓取之前和之后打开和关闭捕获设备(这对我不起作用,因为我的事件可能每秒触发多次); 或者假设一个固定的帧率并在每个事件上读取固定的n次(这对我不起作用,因为我的事件是不可预测的并且可能在任何时间间隔发生).

一个很好的解决方案是:

while True:
    if event:
        while capture_has_frames:
            img = cap.read()
        preprocess(img)

    process(img)
    cv.Waitkey(10)
Run Code Online (Sandbox Code Playgroud)

但是capture_has_frames是什么?有可能得到这些信息吗?我试着查看CV_CAP_PROP_POS_FRAMES,但它总是-1.

现在我有一个单独的线程,其中捕获以全fps运行,而在我的事件中,我正在抓取该线程的最新图像,但这似乎有点过分.

(我用的是Ubuntu 16.04顺便说一句,但我想这应该没关系.我也使用pyqtgraph进行显示)

python camera opencv video-capture opencv3.0

11
推荐指数
2
解决办法
3257
查看次数

标签 统计

opencv ×2

c++ ×1

camera ×1

opencv3.0 ×1

python ×1

video ×1

video-capture ×1