EmguCV中的图像不释放资源

时间:2016-11-03 22:14:23

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

我正在使用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语句,但仍然一样。

我的问题是,有没有人遇到类似的东西?实现这些图像对象的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

是的,这样做会让你失去记忆力。我设法耗尽我的32GB系统,进行5000次迭代。问题是ThresholdBinary返回另一个Image,你没有拍摄该图像所以内存被分配但无法处理。改变

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次,我的内存使用量几乎没有移动。