我有一个很大的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'的异常。
答案 0 :(得分:0)
如果您的图像包含大量blob,则内存使用率可能会非常高。您是否尝试过相同尺寸的空白图像?
如果它确实是由你的图像有太多斑点造成的,你可以尝试在blob过滤上添加更多约束。
答案 1 :(得分:0)
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);
}