使用AFORGE.NET ProcessImage的OutOfMemoryException

时间:2014-02-11 23:41:27

标签: c# aforge

我有一个很大的System.Drawing.Bitmap(14399 X 10799),我正在尝试使用AFORGE.NET进行处理。我的算法适用于较小的图像,但是当我调用Process()时,使用这个大小的图像,我会收到OutOfMemoryException。

在调用Process()之前,我的任务管理器报告该应用程序正在使用613MB,在异常时,它使用的是609MB。

我已尝试将我的平台目标设置为x64,但这似乎不会影响异常的发生。

我怀疑异常与内存无关,而是其他东西,我该怎样绕过呢?

// lock image
        BitmapData bitmapData = bitmap.LockBits(
            new Rectangle(0, 0, bitmap.Width, bitmap.Height),
            ImageLockMode.ReadWrite, bitmap.PixelFormat);

        // step 1 - turn background to black
        ColorFiltering colorFilter = new ColorFiltering();

        colorFilter.Red = new IntRange(0, 64);
        colorFilter.Green = new IntRange(0, 64);
        colorFilter.Blue = new IntRange(0, 64);
        colorFilter.FillOutsideRange = false;

        colorFilter.ApplyInPlace(bitmapData);

        // step 2 - locating objects
        BlobCounter blobCounter = new BlobCounter();

        blobCounter.FilterBlobs = true;
        blobCounter.MinHeight = 5;
        blobCounter.MinWidth = 5;

        blobCounter.ProcessImage(bitmapData); //Crash
        Blob[] blobs = blobCounter.GetObjectsInformation();
        bitmap.UnlockBits(bitmapData);

抛出了类型'System.OutOfMemoryException'的异常。

2 个答案:

答案 0 :(得分:0)

如果您的图像包含大量blob,则内存使用率可能会非常高。您是否尝试过相同尺寸的空白图像?

如果它确实是由你的图像有太多斑点造成的,你可以尝试在blob过滤上添加更多约束。

答案 1 :(得分:0)

我有同样的问题, 只需在Aforge.Imaging.Filters中使用ResizeBilinear过滤器或任何其他调整大小过滤器(如果您只是为了获取某些信息而不需要处理完整质量的图像)以及您想要对源图像进行的任何修改通过缩小您找到的对象的点数,可以使用以下方法获取临时按比例缩小的图像进行处理

 Bitmap ResizeMyImage(Bitmap Source, int scalefactor)
        {
            int newHeight = Source.Height / scalefactor;
            int newWidth = (int)(Source.Width * (newHeight / (float)Source.Height));
            ResizeBilinear filter = new ResizeBilinear(newWidth, newHeight);
            return filter.Apply(Source);
        }