EmguCV Out of memory exception in x86 release mode only-锐化图像
EmguCV Out of memory exception in x86 release mode only-Sharpening Images
我正在尝试使用 EmguCV 提高图像的清晰度
Image<Bgr, Byte> myImage = new Image<Bgr, Byte>(new Bitmap(pictureBox1.Image));
float[,] matrixKernel = new float[3, 3] {
{ 0,-1, 0 },
{-1, 5,-1 },
{ 0,-1, 0 }
};
ConvolutionKernelF matrix = new ConvolutionKernelF(matrixKernel);
Image<Bgr, float> result = myImage.Convolution(matrix);
Image<Bgr, Byte> BGRResult = result.ConvertScale<byte>(1, 0);
e.Result = BGRResult.ToBitmap();
myImage.Dispose();
result.Dispose();
BGRResult.Dispose();
该代码适用于中分辨率图像,但使用高分辨率图像时,例如:6000X4000 抛出以下异常
请注意,当项目设置为 AnyCPU -> Debug Mode 时,即使对于高分辨率图像,锐化也能正常工作
我正在使用 EmguCV 3.3
更新:
根据 Rick 的参考答案,我做了以下修改,但问题 persists.Please 建议。
float[,] matrixKernel = new float[3, 3] {
{ 0,-1, 0 },
{-1, 5,-1 },
{ 0,-1, 0 }
};
ConvolutionKernelF matrix = new ConvolutionKernelF(matrixKernel);
var result2 = myImage.CopyBlank();
var handle = GCHandle.Alloc(result2);
Image<Bgr, float> result = result2.Convolution(matrix);
Image<Bgr, Byte> BGRResult = result.ConvertScale<byte>(1, 0);
bm_dest = new Bitmap(BGRResult.ToBitmap());
handle.Free();
BGRResult.Dispose();
result.Dispose();
myImage.Dispose();
matrix.Dispose();
我认为这是与评论中链接的访问冲突不同的问题。
Convolve
在底层 OpenCv API 中调用 Filter2D
- 它适用于 单通道浮动图像 .
您正在传递一个多通道字节图像。
Emgu 3.3 将您的输入转换为浮动图像,每个通道调用一次 Filter2D
并将图像拼接在一起。
对于 6000 x 4000,这需要在调用期间分配大约 576MB,如果您 运行 在 32 位进程中,这将是很多。
编辑:
在每个通道上调用 Filter2d
并随手处理使用较少的内存,但速度会慢一些。
使用我比较熟悉的OpenCvSharp
的例子,过滤的开销只有100mb:
var inputMat = BitmapConverter.ToMat(myBitmap);
var kernel = OpenCvSharp.InputArray.Create(
new float[3, 3] { { 0, -1, 0 }, { -1, 5, -1 }, { 0, -1, 0 } }
);
for (int i = 0; i < inputMat.Channels(); i++)
{
var c1 = inputMat.ExtractChannel(i);
var c2 = c1.Filter2D(inputMat.Type(), kernel);
c1.Dispose();
c2.InsertChannel(inputMat, i);
c2.Dispose();
}
我正在尝试使用 EmguCV 提高图像的清晰度
Image<Bgr, Byte> myImage = new Image<Bgr, Byte>(new Bitmap(pictureBox1.Image));
float[,] matrixKernel = new float[3, 3] {
{ 0,-1, 0 },
{-1, 5,-1 },
{ 0,-1, 0 }
};
ConvolutionKernelF matrix = new ConvolutionKernelF(matrixKernel);
Image<Bgr, float> result = myImage.Convolution(matrix);
Image<Bgr, Byte> BGRResult = result.ConvertScale<byte>(1, 0);
e.Result = BGRResult.ToBitmap();
myImage.Dispose();
result.Dispose();
BGRResult.Dispose();
该代码适用于中分辨率图像,但使用高分辨率图像时,例如:6000X4000 抛出以下异常
请注意,当项目设置为 AnyCPU -> Debug Mode 时,即使对于高分辨率图像,锐化也能正常工作 我正在使用 EmguCV 3.3
更新:
根据 Rick 的参考答案,我做了以下修改,但问题 persists.Please 建议。
float[,] matrixKernel = new float[3, 3] {
{ 0,-1, 0 },
{-1, 5,-1 },
{ 0,-1, 0 }
};
ConvolutionKernelF matrix = new ConvolutionKernelF(matrixKernel);
var result2 = myImage.CopyBlank();
var handle = GCHandle.Alloc(result2);
Image<Bgr, float> result = result2.Convolution(matrix);
Image<Bgr, Byte> BGRResult = result.ConvertScale<byte>(1, 0);
bm_dest = new Bitmap(BGRResult.ToBitmap());
handle.Free();
BGRResult.Dispose();
result.Dispose();
myImage.Dispose();
matrix.Dispose();
我认为这是与评论中链接的访问冲突不同的问题。
Convolve
在底层 OpenCv API 中调用 Filter2D
- 它适用于 单通道浮动图像 .
您正在传递一个多通道字节图像。
Emgu 3.3 将您的输入转换为浮动图像,每个通道调用一次 Filter2D
并将图像拼接在一起。
对于 6000 x 4000,这需要在调用期间分配大约 576MB,如果您 运行 在 32 位进程中,这将是很多。
编辑:
在每个通道上调用 Filter2d
并随手处理使用较少的内存,但速度会慢一些。
使用我比较熟悉的OpenCvSharp
的例子,过滤的开销只有100mb:
var inputMat = BitmapConverter.ToMat(myBitmap);
var kernel = OpenCvSharp.InputArray.Create(
new float[3, 3] { { 0, -1, 0 }, { -1, 5, -1 }, { 0, -1, 0 } }
);
for (int i = 0; i < inputMat.Channels(); i++)
{
var c1 = inputMat.ExtractChannel(i);
var c2 = c1.Filter2D(inputMat.Type(), kernel);
c1.Dispose();
c2.InsertChannel(inputMat, i);
c2.Dispose();
}