Halcon 内存泄漏记录 - C#
1. Bitmap 转 HImage
由于Bitmap 在转化时使用BitmapData数据,BitmapData数据无法Dispose, 所以在使用时,使用using:
try
{
using (Bitmap b = bmp.Clone() as Bitmap)
{
if (bmp == null)
{
image = null;
return;
};
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData srcBmpData = b.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
HObject _image;
HOperatorSet.GenImage1(out _image, "byte", b.Width, b.Height, srcBmpData.Scan0);
image = new HImage(_image);
_image.Dispose();
b.UnlockBits(srcBmpData);
srcBmpData = null;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.Source);
Console.WriteLine(ex.StackTrace);
image = null;
}
2. new 之后要Dispose()
HObject obj = new HObject(image);
HOperatorSet.ZoomImageFactor(obj, out hoImageZoomed, scaleR, scaleC, "constant");
obj.Dispose();
不能直接使用
HOperatorSet.ZoomImageFactor(new HObject(image), out hoImageZoomed, scaleR, scaleC, "constant");
3. 切换配方后,内存会增加
切换配方时,会重新添加检测界面模块,需要先释放
tabPageSettingList.ForEach(b => b.Dispose());
tabPageSettingList.Clear();
4. Parallel.For 嵌套Parallel.For, 会出现问题
5. 图像预处理使用需要注意不能直接在原有变量上赋值
image = image.ScaleImageMax();
改为
HImage scaleImg = new HImage();
if (image != null)
{
scaleImg = image.ScaleImageMax();
}
.....
scaleImg.Dispose();
6. 谨慎使用ConcatObj() 存储NG或者OK区域
当OK或者NG太多时,大分辨率图像下会导致内存暴增,并且运行速度缓慢
解决方案:
- 若可以,请使用Union,将区域连接在一起,当成一个区域;
- 若存在不同缺陷,可以多定义几个变量,分开合并;