OpenCV泄漏内存(cvResize,cvCreateImage)

时间:2017-12-06 21:29:50

标签: c opencv memory memory-leaks

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

我需要从网络摄像头调整图像尺寸,因此我使用了cvResize()功能。

它工作正常,但几秒钟后我的内存不足,因为我在while(1) - 循环中执行代码并阅读有关此问题的其他人,我怀疑内存泄漏。

这是我的代码:

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()更改帧的捕获分辨率,但这没有做任何事情。

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

提前致谢

1 个答案:

答案 0 :(得分:1)

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

在每次while - 循环迭代之后,必须释放帧的已分配内存。这可以使用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);
    }

}