我使用这个例程将视频的所有帧都放入一个帧数组中:
点击:
private int CompareTwoVideos(string _firstVideoPath, string _secondVideoPath)
{
Capture _capture;
List<Image<Gray, Byte>> FirstALLFrames = new List<Image<Gray, Byte>>();
// ..
_capture = new Capture(FirstVideoLocation);
// get all frames
FirstALLFrames = GetAllFrames(_capture);
// do some image processing
// ..
_capture.Dispose();
return 0;
}实用功能:
List<Image<Gray, byte>> GetAllFrames(Capture _capture)
{
List<Image<Gray, byte>> AllFrames = new List<Image<Gray, byte>>();
int FramesCount = 0;
try
{
FramesCount = (int)_capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_COUNT);
for (int i = 0; i < FramesCount - 1; i++)
{
AllFrames.Add(_capture.QueryGrayFrame().Resize(ImageWidth, ImageHeight, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR));
}
}
catch (Exception ex)
{
// Error pops here
}
return AllFrames;
}在第一次单击时,一切都正常。
但是,在第二次单击时会弹出错误。
有什么想法吗?
发布于 2017-03-23 13:48:21
我不是百分之百肯定你的意思与“第二次点击”,但我假设这意味着你直接运行的代码,以处理另一个视频。
似乎您的列表变得很大,占用了很多内存(这也是在列表(T) MSDN文档中的例外项下编写的)。您确实释放了您的_capture对象,但是没有释放您的列表。因此,列表中可能仍然有引用,这会阻止系统正确地处理和收集引用(因此,请确保没有对列表的任何其他引用)。
此外,替换引用(使用new List()实例)不会立即释放该收集,垃圾收集器处理该对象需要时间。很可能第二次点击只会导致你的程序使用太多的内存,因为它现在在内存中包含了太多的视频。您是否监控了应用程序内存的使用情况?
因此,您可以尝试以下几种方法:
List.Clear()方法可能会有所帮助,因为它消除了列表中的值。不过,它并不直接释放分配的内存。这可能会有所帮助,因为垃圾收集可以快速清理列表,尽管我不确定这在您的情况下会有多有效。List = null,确保删除了对列表的所有引用。然后通过调用GC.Collect()强制垃圾收集器直接收集垃圾。这将占用资源,因为此时调用收集器可能并不完全合适,但特别是如果性能不是问题,这不应该造成问题。https://stackoverflow.com/questions/42799925
复制相似问题