【问题标题】:Getting OpenCV Error: Insufficient memory while running OpenCV Sample Program: "stitching_detailed.cpp"出现 OpenCV 错误:运行 OpenCV 示例程序时内存不足:“stitching_detailed.cpp”
【发布时间】:2018-05-23 22:37:00
【问题描述】:

我最近开始使用 OpenCV,目的是将大量图像拼接在一起以创建大量全景图。为了开始我的实验,我查看了 OpenCV 文件附带的示例程序,以了解如何实现 OpenCV 库。由于我对图像拼接感兴趣,我直接去了“stitching_detailed.cpp”。代码可以在:

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/cpp/stitching_detailed.cpp?rev=6856

现在,这个程序完成了我需要它做的大部分工作,但我遇到了一些有趣的事情。我发现,对于 15 个可选投影变形器中的 9 个,我在尝试运行程序时收到以下错误:

    Insufficient memory (Failed to allocate XXXXXXXXXX bytes) in unknown function, 
    file C:\slave\winInstallerMegaPack\src\opencv\modules\core\src\alloc.cpp, 
    line 52

其中“X”标记在不同类型的投影之间变化的整数(好像不同的方法需要不同的空间量)。 “alloc.cpp”的完整源代码可以在以下网站找到:

https://code.ros.org/trac/opencv/browser/trunk/opencv/modules/core/src/alloc.cpp?rev=3060

但是,alloc.cpp 中发出此错误的代码行是:

    static void* OutOfMemoryError(size_t size)
    {
    --HERE--> CV_Error_(CV_StsNoMem, ("Failed to allocate %lu bytes", (unsigned long)size));
        return 0;
    }

因此,我完全不知道可能发生此错误的可能原因。我意识到如果系统内存不足,通常会​​发生此错误,但是根据我的任务管理器,当我使用我的测试图像运行这个程序时,我从来没有使用超过 3.5GB 的 RAM。

此外,由于该程序是由 OpenCV 开发人员作为 OpenCV 拼接功能的示例编写的,我很难相信源代码中存在严重的内存错误。

最后,如果我使用一些变形方法,程序可以正常工作:

- spherical
- fisheye
- transverseMercator
- compressedPlanePortraitA2B1
- paniniPortraitA2B1 
- paniniPortraitA1.5B1)

但是要求程序使用任何其他的(通过命令行标签
--warp [PROJECTION_NAME]):

- plane
- cylindrical
- stereographic
- compressedPlaneA2B1
- mercator
- compressedPlaneA1.5B1
- compressedPlanePortraitA1.5B1
- paniniA2B1
- paniniA1.5B1

我收到上述错误。我从transverseMercator project warper 得到了很好的结果,但我想特别测试立体图。谁能帮我解决这个问题?

我尝试处理的图片分辨率为 1360 x 1024,我的计算机具有以下统计信息:

Model: HP Z800 Workstation
Operating System: Windows 7 enterprise 64-bit OPS
Processor: Intel Xeon 2.40GHz (12 cores)
Memory: 14GB RAM
Hard Drive: 1TB Hitachi
Video Card: ATI FirePro V4800

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: c++ memory opencv


    【解决方案1】:

    当我运行 OpenCV 的 APP traincascade 时,我得到了和你一样的错误:

    Insufficient memory (Failed to allocate XXXXXXXXXX bytes) in unknown function, 
        file C:\slave\winInstallerMegaPack\src\opencv\modules\core\src\alloc.cpp, 
        line 52
    

    当时,我的 RAM(6G)只有大约 70% 被占用。而当我一步步运行trainscascade时,我发现当它使用大约超过1.5G的RAM空间时会抛出错误。 然后,我发现有两个参数可以控制应该使用多少内存:

    -precalcValBufSize -precalcIdxBufSize 所以我尝试将这两个设置为128,它运行。希望我的经验可以帮到你。

    我认为这个问题与内存泄漏无关,它只是与操作系统限制应用程序占用多少内存有关。我希望有人可以检查我的猜测。

    【讨论】:

    • 我遇到了和你一样的问题,我尝试将-precalcValBufSize-precalcIdxBufSize 都更改为512,但它什么也没改变......直到我看到你的答案,我才想到!将这些参数设置为 128 确实对我有用,我想花点时间感谢您! (:
    【解决方案2】:

    这可能和拼接的顺序有关,我把一张大图分割成3*3,先逐行拼接没有问题,逐列拼接时出现问题和你一样。

    【讨论】:

    • 这应该是一条评论。
    【解决方案3】:

    我最近遇到了与 OpenCV 图像拼接类似的问题。我已经使用create方法创建stitcher实例,并提供了5张垂直顺序的图像来stitch方法,但是我收到了内存不足的错误。

    设置后全景创建成功:

    setWaveCorrection(false)

    如果您需要波浪校正,此解决方案将不适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2020-10-17
      • 1970-01-01
      • 2012-07-28
      • 2015-08-23
      相关资源
      最近更新 更多