打开CV GUI错误处理程序-内存不足
本文关键字:程序 内存不足 处理 错误 CV GUI 打开 | 更新日期: 2023-09-27 18:00:30
我目前在一个站点有几个站点,他们只是报告其中一个站点显示了以下错误:
打开CV GUI错误处理程序
内存不足(内存不足)在函数cvAlloc中,.cvAlloc.cpp(111)
这些机器作用很小,它们连接到Suprema RealScan生物识别手指扫描仪:http://www.supremainc.com/eng/product/ls_20.php?mark=52
我怀疑问题来自以下方面:
作为此设备SDK的一部分,您可以注册"预览回调"。这意味着,当设备启动时,此回调将启动并提供一个指向图像的指针,该图像是来自扫描仪的实际图像。使用此选项可以在用户将手指放置在设备上时显示手指的实时图像。当设备处于捕获模式时,回调每隔几毫秒就会触发一次。当设备停止捕获callBacks时停止。
当我们开始集成SDK时,我们意识到它允许我们将此图像指针转换为C#图像类型的唯一方法是通过一个将指针数据保存到文件中的函数。然后,我们必须从创建的文件中读取图像,并删除该文件。我们觉得这有点疯狂,所以给他们的支持发了一封电子邮件,询问是否有一种方法可以将Image指针转换为代码中的C#图像,而无需首先使用他们的SDK将其保存到文件中。
他们为我们提供了以下功能(他们说还没有经过测试,有人刚刚写了它),我相信这就是这个错误的来源,因为其他一切都是非常基本的:
public void ProcessNewPreviewImage(IntPtr imageData, int imageWidth, int imageHeight)
{
try
{
if (realScanCapturing)
{
//______________________________________
// Create byte[] to store the image data
byte[] templateRawData;
//________________________________________
// Init the array to the size of this image
templateRawData = new byte[imageWidth * imageHeight];
//____________________________________
// Get the size of the image as a UINT
uint size = Convert.ToUInt32(imageWidth * imageHeight);
//__________________________________________________________
// Copy the pointer image data to the byte[] we just created
CopyMemory(templateRawData, imageData, size);
//_____________________________________________________________________
//Create a new bitmap object usign this preview images height and width
Bitmap tmpBmp = new Bitmap(imageWidth, imageHeight, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
//_________________________________________
// Create the color palette for this bitmap
System.Drawing.Imaging.ColorPalette cp = tmpBmp.Palette;
for (int i = 0; i <= 255; i++)
{
cp.Entries[i] = Color.FromArgb(i, i, i);
}
//________________________________________
// Assign this color palette to the bitmap
tmpBmp.Palette = cp;
//_________________________________________________________________
// Create a new rectangle object using the dimensions of our bitmap
Rectangle rect = new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height);
//_____________________________________________________________________________
// Create a BitmapData object (which will be used to modify the preview image?)
System.Drawing.Imaging.BitmapData tmpBMPData = null;
//________________________________________________________________________________________________
// Locks the bitmap holding the preview image into memory so that we can change it programatically
tmpBMPData = tmpBmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, tmpBmp.PixelFormat);
//__________________________________________________________________________
// Create new pointer pointing at the start of the image data we just locked
IntPtr ptr = tmpBMPData.Scan0;
//__________________________________________________________
// Copy the raw template data to the pointer we just created
System.Runtime.InteropServices.Marshal.Copy(templateRawData, 0, ptr, imageWidth * imageHeight);
//__________________
// Unlock the bitmap
tmpBmp.UnlockBits(tmpBMPData);
System.IO.MemoryStream msImage = new System.IO.MemoryStream();
tmpBmp.Save(msImage, ImageFormat.Bmp);
byte[] byteImage = Util.ImageToByteArray(tmpBmp);
//______________________________
// Send the extracted image data back to the client for display
thisClientServer.GetStreamingWcf(activeClientStation.VtServerDetails.ServerIpAddress, (int)activeClientStation.StreamingPort).StreamImage(byteImage);
tmpBmp.Dispose();
}
}
catch (Exception ex)
{
ShowDebugMessage("Error in ProcessNewPreviewImage: " + ex.Message);
}
}
这些评论是我自己添加的,因为我一直在努力理解这里实际发生的事情,我仍然不认为我完全理解他们在做什么。它确实有效,而且我在测试过程中没有遇到过错误,但很明显,在长时间大量使用后,会出现这个错误。
我希望有人能更好地理解他们提供给我的代码,并强调可能导致问题的任何方面?
感谢您的帮助!当做Adrian
我最终发现了内存泄漏。