我想将视频导入我的项目并将其存储到以下列表中:

List<Image<Bgr, Byte>> MyVideo = new List<Image<Bgr, Byte>>();

我正在使用计时器执行此操作,该计时器每33 ms捕获一次
MyVideo.Add(_capture.QueryFrame());

如果我使用ImageBox.Image = _capture.QueryFrame()显示捕获的捕捉帧,那么一切都很好,并且我可以看到每个帧。但是,如果我尝试观看列表中的帧,则会始终只显示视频中的最后一个帧。就像视频中的每个帧都被最后一个帧所取代。任何想法如何解决这个问题?

最佳答案

EmguCV的Capture类在内部使用单个Image存储每个帧,以避免过多的内存分配。一旦调用QueryFrame,内部Image对象就会被新框架的内容覆盖。
如果要存储框架以供以后使用,则必须在调用QueryFrame之后创建一个深拷贝,如下所示:
var FrameCopy = _capture.QueryFrame().Clone();
或者根据您的情况,将深拷贝添加到列表中:
MyVideo.Add(_capture.QueryFrame().Clone());
如果以ImageBox可视化视频,则可以看到所有帧,因为在查询下一帧之前已显示一个帧。

关于c# - OpenCV的Queryframe()仅返回一帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34507346/

10-09 02:26