获取OpenCV错误:运行OpenCV示例程序时内存不足:"stitching_detailed.cpp"

use*_*326 5 c++ memory opencv

我最近开始使用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
Run Code Online (Sandbox Code Playgroud)

其中"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;
    }
Run Code Online (Sandbox Code Playgroud)

所以,我很遗憾可能会出现这种错误的原因.我意识到,如果系统内存不足,通常会​​发生此错误,但是当我使用我的测试图像运行此程序时,我根本不会使用更多~3.5GB的RAM,根据我的任务管理器.

此外,由于程序是作为OpenCV开发人员的OpenCV拼接功能的一个样本编写的,我发现很难相信源代码中存在严重的内存错误.

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

- spherical
- fisheye
- transverseMercator
- compressedPlanePortraitA2B1
- paniniPortraitA2B1 
- paniniPortraitA1.5B1)
Run Code Online (Sandbox Code Playgroud)

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

- plane
- cylindrical
- stereographic
- compressedPlaneA2B1
- mercator
- compressedPlaneA1.5B1
- compressedPlanePortraitA1.5B1
- paniniA2B1
- paniniA1.5B1
Run Code Online (Sandbox Code Playgroud)

我收到上面提到的错误.我从transverseMercator项目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
Run Code Online (Sandbox Code Playgroud)

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

小智 2

当我运行 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
Run Code Online (Sandbox Code Playgroud)

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

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

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