Emgu.CV.VideoCapture.Retrieve始终返回false的问题

2019.5.10

程序中用emgu.cv来从监控的RTSP视频中抓图像出来做后续的处理。

之前一直是正常的,能抓到图像。昨天突然发现抓不到图像了,跟踪调试后发现是VideoCapture.Retrive函数始终返回false。

搜索了一番,几乎没有这样的问题

这种情况,要么是我的程序哪里存在低级或者特别的问题,大家都不怎么会犯,要么是新问题,还没人在网上说起。

先自己分析吧。

》》是网络问题?

在同一台机器上,同时用VLC打开RTSP,播放正常,排除网络原因。

》》机器一直用休眠,是不是太久没重启了?

这个原因有点玄学,还是试了试,问题照旧。

》》是第三方库的原因?

从另一台机器上拷了第三方库替换掉本地的对应文件,图像抓到了。太好了,比较一下文件应该就能定位 问题原因所在了。

一个一个的排除,最终确定cvextern.dll这个文件有问题

将4.0替换成老版本,视频图像就抓出来了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!如果使用 Emgu.CV 中的 `VideoCapture` 类以及 `DShow` API 捕获的视频帧为空,可能是由于以下几个原因导致的: 1. 检查摄像头索引:确保您传递给 `VideoCapture` 构造函数的摄像头索引正确。您可以尝试不同的索引值来查看是否能够正确捕获视频。 2. 检查视频捕获初始化:在创建 `VideoCapture` 对象后,使用 `IsOpened` 属性检查视频捕获是否成功初始化。如果返回值为 false,则表示初始化失败,可能是由于摄像头不可用或权限限制等原因。 3. 检查视频帧读取:使用 `Read` 方法读取视频帧,并使用 `RetrieveBgrFrame` 或 `RetrieveGrayFrame` 方法将其转换为 BGR 或灰度图像。请确保在每次循环迭代中成功读取到了帧。 以下是一个示例代码,展示了如何使用 Emgu.CV 捕获视频帧: ```csharp using Emgu.CV; using Emgu.CV.CvEnum; // 摄像头索引 int cameraIndex = 0; // 创建 VideoCapture 对象 VideoCapture capture = new VideoCapture(cameraIndex, VideoCapture.API.DShow); // 检查视频捕获是否成功初始化 if (!capture.IsOpened) { Console.WriteLine("无法打开摄像头!"); return; } while (true) { // 读取视频帧 Mat frame = new Mat(); if (!capture.Read(frame)) { Console.WriteLine("无法读取视频帧!"); break; } // 检查是否成功读取到了帧 if (frame.IsEmpty) { Console.WriteLine("视频帧为空!"); break; } // 在这里对每一帧进行处理(可选) // 显示帧 CvInvoke.Imshow("Frame", frame); // 按下 ESC 键退出循环 if (CvInvoke.WaitKey(1) == 27) break; } // 释放资源 capture.Dispose(); CvInvoke.DestroyAllWindows(); ``` 请根据您的需求进行相应的修改和调整。希望这可以帮助您解决问题!如果问题仍然存在,请提供更多的详细信息以便我能够更好地帮助您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值