gpt4 book ai didi

c++ - OpenCv - 从网络摄像头捕获帧时内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 08:32:20 25 4
gpt4 key购买 nike

我正在编写一个 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 应用程序,我包含的唯一 header 是:

/*******************************************************************************
* 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>

那里似乎混合了 opencvopencv2,但我找不到只使用 opencv 的方法标题并可以在没有它们的情况下访问相机。我担心这可能会导致某些仅 C++ 代码以未定义的方式初始化。解决内存泄漏的任何帮助,或者如果需要,在没有泄漏的情况下用 C++ 创建等效代码将非常有帮助。

感谢您的帮助。

最佳答案

这个对我来说不会泄漏:

#include <opencv2\opencv.hpp>
int main()
{
CvCapture* capture;
IplImage* frame;

capture = cvCreateCameraCapture(0);
while (1)
{
if (capture)
{
frame = cvQueryFrame(capture);
}
}
cvReleaseCapture(&capture);
}

这个显然确实泄漏了:

int main()
{
CvCapture* capture;
IplImage* frame;
IplImage* tmp;

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);
}

虽然这个没有泄漏:

int main()
{
CvCapture* capture;
IplImage* frame;
IplImage* tmp;

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

// release tmp:
cvReleaseImage(&tmp);
}
}
cvReleaseCapture(&capture);
}

你能试试最后一个例子吗?如果确实泄漏,您可能确实遇到了错误 header 或链接库的问题。

关于c++ - OpenCv - 从网络摄像头捕获帧时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27762518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com