【问题标题】:OutOfMemoryException using AFORGE.NET ProcessImageOutOfMemoryException 使用 AFORGE.NET ProcessImage
【发布时间】:2014-02-11 23:41:26
【问题描述】:

我有一个很大的 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”类型的异常。

【问题讨论】:

  • 这几乎总是与Rectangle 大于Bitmap 区域有关。在将bitmap 捕获到bitmapData 之前检查它的尺寸。
  • “我怀疑异常与内存无关” - 异常几乎不会说谎。 “我怎样才能绕过它?” - 通过分块处理你的图像。
  • 一个 32 位进程不会引发 OOM,因为它完全内存不足,当它找不到足够大的孔以适应分配时,它会卡布。您的图像需要一个足够大的孔来容纳 622 兆字节,这很难得到。很久以前就已经解决了一个问题,64 位操作系统是普遍可用的。将平台目标设置更改为 AnyCPU 以利用它。

标签: c# aforge


【解决方案1】:

如果您的图像包含大量 blob,则内存使用量可能会非常高。你试过同样大小的空白图片吗?

如果真的是因为你的图片有太多的blob,你可以尝试在你的blob过滤上添加更多的约束。

【讨论】:

    【解决方案2】:

    我有类似的问题, 只需使用 ResizeBilinear 过滤器或 Aforge.Imaging.Filters 中的任何其他调整大小过滤器(如果您只是为了获取一些信息而处理它,则不需要完整质量的图像)以及您想要对源图像进行的任何修改它已完成通过缩小您找到的对象的点,以下是获取临时缩小图像进行处理的简单方法

     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);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 2012-11-25
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多