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无法打开视频