无法在大图像OpenCV中分配字节

时间:2011-03-31 12:58:42

标签: .net opencv out-of-memory

我正在处理非常大的图像,但是我得到一个异常,通知我“无法分配991623040字节”

我有64位Win7和8GB内存。当小于1GB时,是不是失败了?

我该如何解决这个问题?

public bresenhamCircle()
    {
        if (path != null) //path is a string represents the file path
        {
            using (IplImage orgImg = new IplImage(rc.imgeYolu, LoadMode.GrayScale))
            {
                if (rc.sekizBit)
                {
                    orgImg.ToBitmap();
                }
                else
                {
                    //binary image
                }

                using (IplImage imgLabel = new IplImage(orgImg.Size, BitDepth.F32, 1))
                {
                    using (CvBlobs blobs = new CvBlobs())
                    {


                        uint result = blobs.Label(orgImg, imgLabel);
                        blobs.FilterByArea(10, 130);
                    }
                }


            }
        }
        else
        {
            throw new Exception("smtg..");
        }

    }

我收到此行的错误消息: 使用(IplImage imgLabel = new IplImage(orgImg.Size,BitDepth.F32,1))

2 个答案:

答案 0 :(得分:0)

可能有几个原因;很可能是因为你有内存泄漏。我们需要看看你的代码,上面的代码看起来你没有使用“*”运算符在指针处声明图像,但这可能是一个错字。另外,因为你有64位窗口和8 GB RAM,如果你使用的是32位版本的opencv,你只能访问2 GB的RAM。我建议下载最新的opencv SVN版本并以64位模式构建并启用tbb。

答案 1 :(得分:0)

如果您没有以64位模式运行应用程序,那么您不使用8 GB的RAM。内存不足也是由连续的虚拟地址空间不足而不是物理地址空间引起的,请参阅文章http://vpnchoudhary.blogspot.com/2011/03/out-of-memory-exception-simple.html,了解有关32位应用程序的内存管理的详细信息。

首先验证您的应用程序是否在64中运行。打开任务mgr并查看您的应用程序是否附加了* 32。如果是,则您的应用程序以32位模式运行。编译64位应用程序。它应该解决你的问题。 如果您的应用程序已经在64位运行,那么您的应用程序正在泄漏内存,但我非常怀疑它,因为您正在使用“使用”,它应该处理对象。 此外,对于64位应用程序,您将获得巨大的虚拟地址空间,这很难耗尽,您的应用程序将开始颠簸(非常慢)但很少会耗尽内存。