C++ 突然阻止使用 VideoCapture 从 IP 摄像机读取帧

Posted

技术标签:

【中文标题】C++ 突然阻止使用 VideoCapture 从 IP 摄像机读取帧【英文标题】:C++ suddenly blocks on reading a frame from IP camera using VideoCapture 【发布时间】:2016-04-20 17:10:04 【问题描述】:

我正在使用 OpenCV 3。如果摄像机与网络断开连接或帧出现问题,则使用带有 IP 摄像机的 VideoCapture 抓取帧会被阻止。 我首先检查videoCapture.isOpened()。如果是,我尝试了这些方法,但似乎没有任何效果:

1) 抓取器>>帧

if(grabber.isOpened()) 
    grabber >> frame; 
    // DO SOMETHING WITH FRAME

2) 阅读

if(grabber.isOpened()) 
    if(!grabber.grab())
      cout << "failed to grab from camera" << endl;
     else 
      if (grabber.retrieve(frame,0) )
        // DO SOMETHING WITH FRAME
       else 
        // SHOW ERROR
      
    

3) 抓取/检索

if(grabber.isOpened()) 
    if ( !grabber.read(frame) ) 
      cout << "Unable to retrieve frame from video stream." << endl;
    
    else 
     // DO SOMETHING WITH FRAME
     

视频流在某个时间点卡住,使用所有先前选项抓取一帧,每个选项都会阻塞但不退出或返回任何错误。

你知道是否有办法处理或解决这个问题吗?也许一些验证,try/catch 或计时器?

【问题讨论】:

一个很好的使用抓取功能的例子可以在这里找到github.com/Itseez/opencv/blob/master/samples/cpp/…确保你在每一步都做必要的检查。检查视频捕获是否打开是好的,但还不够。 .read() 与 .grab 后跟 .retrieve 相同,因此您的应用正在读取一个帧,然后尝试读取第二个帧,这意味着等待新帧可用(取决于在 fps 上可能需要一些时间...) @Micka 我分别尝试了这三个选项,但它们都在某些时候一直阻塞程序......我想我需要某种验证或等待时间......有什么想法吗? @Micka 我添加了一些示例代码 @Elmira 感谢您的建议。我检查了一下,我认为我在做同样的事情,你认为我在你展示给我的例子中遗漏了什么吗? 【参考方案1】:

this merge 解决了这个问题,但不幸的是 opencv_ffmpeg.dll 还没有发布。

你可以找到here更新opencv_ffmpeg.dll并测试。

【讨论】:

感谢您的帮助!我会看看。问题是我在 linux 上,对此有什么想法吗? 如果您阅读 cmets here,您会看到我的评论,询问如何为 windows 更新 opencv_ffmpeg.dll。你可以在那里问linux怎么样。 更新:我询问并被告知“Linux 上没有单独的 opencv_ffmpeg.dll。要在 OpenCV 中启用 ffmpeg 支持,您需要安装 ffmpeg 开发包(-dev/-devel,取决于 Linux分发)并重新运行 OpenCV CMake"

以上是关于C++ 突然阻止使用 VideoCapture 从 IP 摄像机读取帧的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 OpenCv 的 VideoCapture 大小错误

使用 OpenCV C++ 接口,我是不是需要发布使用 VideoCapture(int 设备?)

opencv (c++) VideoCapture无法打开视频

opencv (c++) VideoCapture无法打开视频

从 OpenCV(C++)中的目录读取多个图像

无法使用 C++ 和 OpenCV 从视频中提取帧