我想将视频导入我的项目并将其存储到此列表中:
List<Image<Bgr, Byte>> MyVideo = new List<Image<Bgr, Byte>>();
我正在使用计时器执行此操作,该计时器每隔33 ms使用
捕获一帧MyVideo.Add(_capture.QueryFrame());
如果我用ImageBox.Image = _capture.QueryFrame()
显示当前捕获的帧,一切都很好,我可以看到每一帧。但是如果我尝试在我的列表中观看帧,它只显示视频中的最后一帧,即整个时间。就像视频中的每个帧都被最后一帧所取代。任何想法如何解决这个问题?
答案 0 :(得分:2)
EmguCV的Capture
类在内部使用单个Image
来存储每个帧,以避免过多的内存分配。一旦调用QueryFrame
,内部Image
对象就会被新帧的内容覆盖。
如果我们想要存储框架供以后使用,我们必须在调用QueryFrame
之后创建一个深层副本:
var FrameCopy = _capture.QueryFrame().Clone();
或者在您的情况下,将深层副本添加到列表中:
MyVideo.Add(_capture.QueryFrame().Clone());
如果ImageBox
中的视频可视化,您可以看到所有帧,因为在查询下一帧之前会显示一个帧。