打开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

打开CV GUI错误处理程序-内存不足

我最终发现了内存泄漏。