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的Capture
class内部使用单个Image
来存储每一帧,避免过多的内存分配。一旦 QueryFrame
被调用,内部的 Image
对象就会被新框架的内容覆盖。
如果我们想存储帧供以后使用,我们必须在调用 QueryFrame
之后创建一个深拷贝,如下所示:
var FrameCopy = _capture.QueryFrame().Clone();
或者在您的情况下,将深层副本添加到列表中:
MyVideo.Add(_capture.QueryFrame().Clone());
在 ImageBox
中可视化视频的情况下,您可以看到所有帧,因为在查询下一帧之前显示了一个帧。
我想将视频导入我的项目并将其存储到此列表:
List<Image<Bgr, Byte>> MyVideo = new List<Image<Bgr, Byte>>();
我用一个定时器来做这个,它每 33 毫秒用
捕获一个帧MyVideo.Add(_capture.QueryFrame());
如果我用 ImageBox.Image = _capture.QueryFrame()
显示当前捕获的帧,一切都很好,我可以看到每一帧。但是,如果我尝试观看列表中的帧,它始终只会显示视频中的最后一帧。就像视频中的每一帧都被最后一帧所取代。任何想法如何解决这个问题?
EmguCV的Capture
class内部使用单个Image
来存储每一帧,避免过多的内存分配。一旦 QueryFrame
被调用,内部的 Image
对象就会被新框架的内容覆盖。
如果我们想存储帧供以后使用,我们必须在调用 QueryFrame
之后创建一个深拷贝,如下所示:
var FrameCopy = _capture.QueryFrame().Clone();
或者在您的情况下,将深层副本添加到列表中:
MyVideo.Add(_capture.QueryFrame().Clone());
在 ImageBox
中可视化视频的情况下,您可以看到所有帧,因为在查询下一帧之前显示了一个帧。