OpenCV的Queryframe() returns只有一帧

OpenCV's Queryframe() returns only one frame

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

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

我用一个定时器来做这个,它每 33 毫秒用

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

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

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

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

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

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

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