首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SystemOutOfMemoryException on QueryGrayFrame()和EmguCV

SystemOutOfMemoryException on QueryGrayFrame()和EmguCV
EN

Stack Overflow用户
提问于 2017-03-15 02:10:48
回答 1查看 137关注 0票数 1

我使用这个例程将视频的所有帧都放入一个帧数组中:

点击:

代码语言:javascript
复制
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;
        }

实用功能:

代码语言:javascript
复制
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;
}

在第一次单击时,一切都正常。

但是,在第二次单击时会弹出错误。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-23 13:48:21

我不是百分之百肯定你的意思与“第二次点击”,但我假设这意味着你直接运行的代码,以处理另一个视频。

似乎您的列表变得很大,占用了很多内存(这也是在列表(T) MSDN文档中的例外项下编写的)。您确实释放了您的_capture对象,但是没有释放您的列表。因此,列表中可能仍然有引用,这会阻止系统正确地处理和收集引用(因此,请确保没有对列表的任何其他引用)。

此外,替换引用(使用new List()实例)不会立即释放该收集,垃圾收集器处理该对象需要时间。很可能第二次点击只会导致你的程序使用太多的内存,因为它现在在内存中包含了太多的视频。您是否监控了应用程序内存的使用情况?

因此,您可以尝试以下几种方法:

  1. 使用List.Clear()方法可能会有所帮助,因为它消除了列表中的值。不过,它并不直接释放分配的内存。这可能会有所帮助,因为垃圾收集可以快速清理列表,尽管我不确定这在您的情况下会有多有效。
  2. 通过调用List = null,确保删除了对列表的所有引用。然后通过调用GC.Collect()强制垃圾收集器直接收集垃圾。这将占用资源,因为此时调用收集器可能并不完全合适,但特别是如果性能不是问题,这不应该造成问题。
  3. 最后,尝试处理每个帧,并在处理下一个帧之前直接丢弃它。或者尝试分批处理视频(任何可能的)。这将减轻你的记忆负担。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42799925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档