【发布时间】:2015-01-04 04:54:07
【问题描述】:
我正在编写一个 C 应用程序,它使用 OpenCv 从网络摄像头捕获图像,然后将图像保存到文件中。它在针对 OpenCv 2.3.1-11 的 Raspian OS Wheezy 上运行。
如果我只是像这样打开和关闭网络摄像头,就没有内存泄漏,所以我认为我不会遇到关于“网络摄像头开放税”的旧错误:
CvCapture* capture;
while (1) {
// No increase in memory consumption at all
capture = cvCreateCameraCapture(0);
cvReleaseCapture(&capture);
}
但是,当我真正开始获取图像时,内存消耗会激增,并且每次迭代都会消耗另外 2MB 的内存。我在手动触发图像采集时在命令行通过free -s 2 确认,并注意到最终,我的应用程序抱怨没有足够的内存来采集图像。
capture = cvCreateCameraCapture(0);
while (1) {
if (capture) {
frame = cvQueryFrame(capture);
}
if (frame) {
CvSize size = cvSize(100, 100);
tmp = cvCreateImage(size, IPL_DEPTH_8U, 3);
cvResize(frame, tmp, CV_INTER_CUBIC);
// Do some stuff with tmp
}
}
cvReleaseCapture(&capture);
我在网上查了很多帖子,都说我不支持修改frame中存储的数据。如果我在frame 上使用cvReleaseImage,它没有效果。事实上,内存使用量仅因cvQueryFrame 调用而爆炸式增长。即使是下面的示例也会导致此问题弹出:
capture = cvCreateCameraCapture(0);
while (1) {
if (capture) {
frame = cvQueryFrame(capture);
}
}
cvReleaseCapture(&capture);
我该如何解决这个问题?
我真的必须使用 C++ API(目前对我来说不是一个真正的选择),还是有其他方法可以解决这个问题?这是一个 Gtk+-2.0 应用程序,我包含的唯一标题是:
/*******************************************************************************
* Preprocessor Directives
******************************************************************************/
#include "opencv/cxcore.h"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/imgproc/imgproc_c.h"
#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
那里似乎混合了opencv 和opencv2,但我找不到只有opencv 标题并在没有它们的情况下访问相机的方法。我担心这可能会导致某些仅 C++ 的代码以未定义的方式初始化。解决内存泄漏的任何帮助,或者如果需要,在 C++ 中创建没有泄漏的等效代码将非常有帮助。
感谢您的帮助。
【问题讨论】:
-
cvReleaseImage on frame, it has no effect你怎么知道没有效果?如果您使用任务管理器或其他一些操作系统工具来确定内存是否泄漏,请不要使用它。使用此类工具不会确定内存泄漏。 -
@PaulMcKenzie 无论这些工具的工作情况如何,如果我在控制台上监控
free -s 2的输出,每次手动触发另一次图像采集时,我都会看到可用系统内存总量下降.我还可以分析应用程序并确认它正在消耗更多内存。 -
tmp曾经发布过吗? -
@PaulMcKenzie 是的,
tmp最终通过一个单独的函数发布,该函数只调用cvReleaseImage(IplImage** imgToFree)。我还添加了另一个仅调用cvQueryFrame导致相同问题的示例。谢谢! -
您的线程是否在不释放 tmp 等的情况下中断/取消/重新启动/修改?
标签: c++ c opencv memory-leaks gtk