OpenCV的Queryframe()只返回一帧

时间:2015-12-29 08:32:15

标签: c# opencv emgucv

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

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

我正在使用计时器执行此操作,该计时器每隔33 ms使用

捕获一帧
MyVideo.Add(_capture.QueryFrame());

如果我用ImageBox.Image = _capture.QueryFrame()显示当前捕获的帧,一切都很好,我可以看到每一帧。但是如果我尝试在我的列表中观看帧,它只显示视频中的最后一帧,即整个时间。就像视频中的每个帧都被最后一帧所取代。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

EmguCV的Capture类在内部使用单个Image来存储每个帧,以避免过多的内存分配。一旦调用QueryFrame,内部Image对象就会被新帧的内容覆盖。 如果我们想要存储框架供以后使用,我们必须在调用QueryFrame之后创建一个深层副本:

var FrameCopy = _capture.QueryFrame().Clone();

或者在您的情况下,将深层副本添加到列表中:

MyVideo.Add(_capture.QueryFrame().Clone());

如果ImageBox中的视频可视化,您可以看到所有帧,因为在查询下一帧之前会显示一个帧。