我在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()
更改帧的捕获分辨率,但这没有做任何事情。
有人可以帮我理解这里出了什么问题吗?
提前致谢
答案 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);
}
}