cvLoadimage在运行时停止工作

时间:2012-04-25 09:16:41

标签: c++ linux opencv

我一直在研究一个图像识别程序,但突然间我注意到当我测试程序的时间较长时,函数cvLoadImage有时会停止返回图像。我发现没有明确的模式或时间发生这种情况,但是一旦它失败,它将继续失败,直到程序的其余部分,直到我重新开始。这条代码只运行一次以更新我的用户界面。

我的代码:

IplImage* UIframe = cvLoadImage("../images/background.jpg", CV_LOAD_IMAGE_COLOR);
if(UIframe) {
 //do stuff
} else {
 cout<<"Image not loaded"<<endl;
}
cvReleaseImage(&UIframe);

我检查过cvLoadImage失败的原因有几个:

  • 路径是静态的,并且在程序的早期工作,因此文件在那里
  • 我发布图像,没有其他内存泄漏导致此
  • 尝试加载时没有更新.jpg
  • 我已经安装了所有正确的库,因为cvLoadImage在早期工作

一种解决方案是只加载图像一次并不断更新内存,但我想了解为什么会发生这种情况以及如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

您使用的是最新的OpenCV(2.3.1)吗?

要注意的另一件事是,//do stuff中的任何内容都可能产生内存泄漏,并且在一段时间之后cvLoadImage()失败,因为系统根本没有足够的内存来加载新映像

事实是,有一个简单的测试来发现问题是在OpenCV 中还是在你的代码中:编写一个加载相同图像N次的最小应用程序。除了调用cvLoadImage()后跟cvReleaseImage()

之外,不要在循环内部执行任何操作

如果这个简单的应用程序失败,那么在OpenCV方面可能会出现问题。如果没有,你知道你在代码中做错了什么。

答案 1 :(得分:0)

当你决定使用相对路径时要小心,你最好仔细检查你的工作目录。这就是你的.exe被执行的地方。 或者说你的程序在运行时是否正在改变工作目录?

答案 2 :(得分:0)

您应该在释放后将UIframe设置为NULL。释放它很好,但可能有一个错误,只是在NULL分配之前导致问题,谁知道? :)

这样可以确保您的文件没有任何内容以防万一。请阅读此question以获取更多解释。