【问题标题】:OpenCV leaks memory (cvResize, cvCreateImage)OpenCV 泄漏内存(cvResize、cvCreateImage)
【发布时间】:2018-05-20 21:25:58
【问题描述】:

我在 RaspberryPi 上运行 OpenCV 并使用 OpenCVs C 接口。

我需要调整来自网络摄像头的图像尺寸,因此我使用了cvResize() 函数。

它工作正常,但是几秒钟后我的内存用完了,因为我在 while(1)-Loop 中执行代码并阅读了其他人遇到此问题的信息,我怀疑内存泄漏。

这是我的代码:

IplImage *frame;
IplImage *frameRaw;

main() {
    CvCapture *capture = cvCreateCameraCapture(-1);

    while (1) {
        frameRaw = cvQueryFrame(capture);
        frame = cvCreateImage(cvSize(WIDTH, HEIGHT), frameRaw->depth, frameRaw->nChannels);

        cvResize(frameRaw, frame, 0); // 0 = CV_INTER_NEAREST

        // Do something with "frame"
    }

}

我已经尝试使用cvReleaseImage(&frameRaw)(或&frame)在每次迭代结束时释放保留的内存,但这总是会导致分段错误。使用cvReleaseImageHeader() 不会导致分段错误,但也不会释放任何内存。

我还尝试通过cvSetCaptureProperty() 更改帧的捕获分辨率,但没有任何效果。

有人可以帮我理解这里出了什么问题吗?

提前致谢

【问题讨论】:

  • 您是否在使用其他库?我在任何地方都找不到 cvFreeImage 或 cvFreeImageHeader。你是说 cvReleaseImage() 吗?
  • 您显示的代码肯定缺少cvReleaseImage 调用,与cvCreateImage 一起使用——您总是分配,从不取消分配。此外,您不应该取消分配 frameRawcvQueryFrame 的文档明确提到了这一点。
  • @bennji_of_the_overflow 你说得对,我的意思是cvReleaseImage(),对我来说似乎为时已晚......
  • 非常感谢@DanMašek 似乎只是在每次迭代解决问题后使用cvReleaseImage(&frame)

标签: c opencv memory memory-leaks


【解决方案1】:

感谢@DanMašek,我找到了解决方案:

在每次while-loop 迭代之后,必须释放为帧分配的内存。这可以使用cvReleaseImage(&frame) 来完成。

现在完整的代码如下所示:

IplImage *frame;
IplImage *frameRaw;

main() {
    CvCapture *capture = cvCreateCameraCapture(-1);

    while (1) {
        frameRaw = cvQueryFrame(capture);
        frame = cvCreateImage(cvSize(WIDTH, HEIGHT), frameRaw->depth, frameRaw->nChannels);

        cvResize(frameRaw, frame, 0); // 0 = CV_INTER_NEAREST

        // Do something with "frame"

        cvReleaseImage(&frame);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2014-01-29
    相关资源
    最近更新 更多