簡體   English   中英

使用AFORGE.NET ProcessImage的OutOfMemoryException

[英]OutOfMemoryException using AFORGE.NET ProcessImage

我有一個試圖使用AFORGE.NET處理的大型System.Drawing.Bitmap(14399 X 10799)。 我的算法在較小的圖像上效果很好,但是在此尺寸的圖像上,我調用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'的異常。

如果您的圖像包含大量斑點,則內存使用量可能會很高。 您是否嘗試過使用相同尺寸的空白圖像?

如果確實是由於圖像中的斑點太多,則可以嘗試對斑點過濾添加更多約束。

我有類似的問題,只需在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);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM