我一直在研究一个图像识别程序,但突然间我注意到当我测试程序的时间较长时,函数cvLoadImage有时会停止返回图像。我发现没有明确的模式或时间发生这种情况,但是一旦它失败,它将继续失败,直到程序的其余部分,直到我重新开始。这条代码只运行一次以更新我的用户界面。
我的代码:
IplImage* UIframe = cvLoadImage("../images/background.jpg", CV_LOAD_IMAGE_COLOR);
if(UIframe) {
//do stuff
} else {
cout<<"Image not loaded"<<endl;
}
cvReleaseImage(&UIframe);
我检查过cvLoadImage失败的原因有几个:
一种解决方案是只加载图像一次并不断更新内存,但我想了解为什么会发生这种情况以及如何解决这个问题。
答案 0 :(得分:1)
您使用的是最新的OpenCV(2.3.1)吗?
要注意的另一件事是,//do stuff
中的任何内容都可能产生内存泄漏,并且在一段时间之后cvLoadImage()
失败,因为系统根本没有足够的内存来加载新映像
事实是,有一个简单的测试来发现问题是在OpenCV 中还是在你的代码中:编写一个加载相同图像N次的最小应用程序。除了调用cvLoadImage()
后跟cvReleaseImage()
。
如果这个简单的应用程序失败,那么在OpenCV方面可能会出现问题。如果没有,你知道你在代码中做错了什么。
答案 1 :(得分:0)
当你决定使用相对路径时要小心,你最好仔细检查你的工作目录。这就是你的.exe被执行的地方。 或者说你的程序在运行时是否正在改变工作目录?
答案 2 :(得分:0)
您应该在释放后将UIframe设置为NULL。释放它很好,但可能有一个错误,只是在NULL分配之前导致问题,谁知道? :)
这样可以确保您的文件没有任何内容以防万一。请阅读此question以获取更多解释。