我最近开始使用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项目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
非常感谢任何帮助,谢谢!
答案 0 :(得分: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
当时,只占我RAM(6G)的70%左右。当runnig traincascade一步一步时,我发现错误会被抛出。当它使用大约1.5G以上的RAM空间时。
然后,我发现有两个参数可以控制应该使用多少内存:
-precalcValBufSize -precalcIdxBufSize 所以我试着将这两个设置为128,它运行。我希望我的经验可以帮到你。
我认为这个问题与内存泄漏无关,它只与操作系统限制应用程序占用的内存量有关。我希望有人能检查我的猜测。
答案 1 :(得分:0)
这可能与拼接的顺序有关,我将一张大图片分成3 * 3,然后我一行一行地拼接它们没有问题,当我逐列拼接时,有问题和你一样。
答案 2 :(得分:0)
我最近遇到过与OpenCV图像拼接相似的问题。我用create方法创建了stitcher实例,并提供了5个垂直顺序的图像拼接方法,但是我收到的内存错误不足。
在设置完成后成功创建了全景:
setWaveCorrection(false)
如果您需要波浪校正,此解决方案将不适用。