我想将视频导入我的项目并将其存储到以下列表中:
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/