【问题标题】:Failed to allocate bytes in large images OpenCV无法在大图像 OpenCV 中分配字节
【发布时间】:2011-06-10 13:29:27
【问题描述】:

我正在处理非常大的图像,但我收到一个异常通知我“无法分配 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))

【问题讨论】:

  • 让我们看看产生这个错误的代码。还要注意你使用的是什么版本的opencv。
  • using (IplImage imgLabel = new IplImage(orgImg.Size, BitDepth.F32, 1)) 这一行会产生错误。 orgImage 大小为 18000x13000,使用以下代码从文件中定义:IplImage orgImg = new IplImage(path, LoadMode.GrayScale) OpenCV 版本为 2.2
  • 编辑您的原始帖子并将代码放入代码块中。

标签: .net opencv out-of-memory


【解决方案1】:

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

【讨论】:

  • 请注意,opencv 2.2 存在很多问题,您最好还是使用 opencv 2.1。话虽如此,最新的 svn 应该已经修复了 2.2 中的大部分问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2016-07-23
    • 2019-11-28
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多