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

时间:2011-06-28 11:24:27

标签: c# unmanaged managed

我现在在一个站点有几个站点,他们只是报告其中一个站点显示以下错误:

打开CV GUI错误处理程序

内存不足(内存不足) 在函数cvAlloc,.cvalloc.cpp(111)

这些机器做得很少,它们连接到Suprema RealScan Biometric手指扫描仪:http://www.supremainc.com/eng/product/ls_20.php?mark=52

我怀疑问题来自以下方面:

作为此设备SDK的一部分,您可以注册“预览回拨”。这意味着当设备启动时,此callBack将触发并提供指向图像的指针,该图像是来自扫描仪的实际图像。使用此选项可以在用户手指放置在设备上时显示用户手指的实时图像。当设备处于捕获模式时,callBack每隔几毫秒触发一次。当设备停止捕获callBacks停止时。

当我们开始集成SDK时,我们意识到它允许我们将此图像指针转换为C#Image类型的唯一方法是通过将指针数据保存到文件的函数。然后,我们必须从创建的文件中读取图像,然后删除该文件。我们认为这有点疯狂,所以通过电子邮件发送他们的支持,询问是否有一种方法可以将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);
        }
    }

这些评论已被我自己添加,因为我一直试图弄清楚这里发生了什么,我仍然认为我不完全理解他们在做什么。它确实有效,我在测试期间没有遇到过这个错误,但很明显在长时间大量使用后会弹出这个错误。

我希望有人能够更好地理解他们为我提供的代码,并突出显示可能导致问题的任何方面?

任何帮助表示赞赏! 问候 阿德里安

1 个答案:

答案 0 :(得分:0)

我最终发现了内存泄漏。