【问题标题】:cvLoadimage stops working during run timecvLoadimage 在运行时停止工作
【发布时间】:2012-04-29 16:59:27
【问题描述】:

我一直在研究图像识别程序一段时间,但突然我注意到,当我长时间测试我的程序时,函数 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 早先正在运行

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

【问题讨论】:

    标签: c++ linux opencv


    【解决方案1】:

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

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

    事实是,有一个简单的测试来发现问题是在 OpenCV 中还是在您的代码中:编写一个最小的应用程序来加载相同的图像 N 次。除了调用 cvLoadImage() 后跟 cvReleaseImage() 之外,不要在循环内执行任何操作。

    如果这个简单的应用程序失败,则可能是 OpenCV 方面的问题。如果没有,你就知道你的代码做错了。

    【讨论】:

    • 我没有使用最新版本的openCV,因为在我开始这个项目时2.2是最新版本。我尝试了您的简单测试并得出了预期的结论,即 openCV 或从硬盘加载图像没有任何问题。我还测试了我的 //do stuff 部分是否有任何内存泄漏,似乎没有内存问题。
    • 同意可能的内存泄漏
    【解决方案2】:

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

    【讨论】:

    • 我的程序在运行时没有改变工作目录,正如我提到的,程序可以在几分钟内正常加载图像并加载图像......但过了一段时间它停止这样做
    【解决方案3】:

    您还应该在释放 UIframe 后将其设置为 NULL。释放它很好,但甚至可能存在一个错误,在 NULL 分配之前确实会导致问题,谁知道呢? :)

    这将确保您的文件没有任何保留,以防万一。在 SO 上阅读此 question 以获得更多解释。

    【讨论】:

      猜你喜欢
      • 2018-10-18
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2014-01-02
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      相关资源
      最近更新 更多