【问题标题】:Images in EmguCV not releasing resourcesEmguCV 中的图像未释放资源
【发布时间】:2016-11-08 11:41:52
【问题描述】:

我正在使用 EmguCV 3.1.0.2282,我发现当我使用图像时,有时它不会释放其资源并耗尽内存,直到 PC 资源不足并引发内存不足异常.

这是我在应用程序中所做的测试代码。单击按钮时,会根据内存中现有的位图实例化一个新的本地图像。如果选中该复选框,它将执行手动处理。

    private void button1_Click(object sender, EventArgs e)
    {
        Image<Bgr, Byte> TempImage = new Image<Bgr, Byte>(CurrentLeftBitmap);
        TempImage.ThresholdBinary(new Bgr(2.2, 3.3, 4.4), new Bgr(100.0, 100.0, 100.0));            
        if (checkBox1.Checked)
        {
            TempImage.Dispose();
            TempImage = null;
        }
    }   

我发现每次单击按钮时,内存都会下降,并且不会在不重新启动应用程序的情况下释放。即使我进行手动处理,内存仍然会下降。有趣的是,如果我注释掉 ThresholdBinary 步骤,它工作正常。但是,它仍然需要手动处理。我也试过 USING 语句,但还是一样。

我的问题是有人遇到过类似的事情吗?实现这些图像对象的正确方法是什么?

【问题讨论】:

    标签: c# memory-leaks garbage-collection emgucv


    【解决方案1】:

    是的,这样做会耗尽您的内存。我设法耗尽了我的 32GB 系统,对你的方法进行了 5000 次迭代。问题是 ThresholdBinary 返回另一个图像,您没有拍摄该图像,因此内存被分配但无法处理。改变

    TempImage.ThresholdBinary(new Bgr(2.2, 3.3, 4.4), new Bgr(100.0, 100.0, 100.0));
    

    Image<Bgr, byte> newImage = TempImage.ThresholdBinary(new Bgr(2.2, 3.3, 4.4), new Bgr(100.0, 100.0, 100.0));
    

    会有所帮助。

    因为它们是本地人,GC 最终会清理它们。但处理东西总是一个好主意。所以我加了

    TempImage.Dispose();
    newImage.Dispose();
    

    运行这 5000 次,我的内存使用量几乎没有变化。

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 2019-03-07
      • 2015-10-04
      • 1970-01-01
      • 2012-01-08
      • 2012-05-04
      • 2020-02-14
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多