最近在利用opencv做一个视频检测模块,其中涉及到要把检测后的图像一帧帧的显示出来,形成视频流的感觉。
问题在于如果利用如下的代码进行连续的图像显示,内存泄露非常严重,不出几分钟,我的4G内存的本本就吃不消了。
原用于连续显示的代码:
int i = 0;
IplImage* img = 0;
char *image_name = "D:/project_java/VideoServer/img/1.jpg";
printf("------------- image to video ... ----------------\n");
int isColor = 1;
//创建窗口
cvNamedWindow( "Image", CV_WINDOW_AUTOSIZE );
while(1)
{
printf("%s%d%s", "image", ++i, ".jpg\n");
img = cvLoadImage(image_name);
if((img)
{
cvShowImage("Image", img.data);
char key = cvWaitKey(30);
}
else
{
printf("Could not load image file...\n");
cvWaitKey(30);
//exit(0);
}
}
cvDestroyWindow("Image");
上面代码的头文件是:
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <stdlib.h>
考虑到我用的是最新的opencv2.4.9,里面有新的图像读取和显示函数,于是我针对上述代码做了改动:
int i = 0;
//IplImage* img = 0;
Mat img;
char *image_name = "D:/project_java/VideoServer/img/1.jpg";
printf("------------- image to video ... ----------------\n");
//创建窗口
cvNamedWindow( "Image", CV_WINDOW_AUTOSIZE );
while(1)
{
printf("%s%d%s", "image", ++i, ".jpg\n");
//img = cvLoadImage(image_name);
img = imread(image_name);
//cvShowImage("Image", img.data);
if((img.data)
{
imshow("Image",img);
char key = cvWaitKey(30);
}
else
{
printf("Could not load image file...\n");
cvWaitKey(30);
//exit(0);
}
}
cvDestroyWindow("Image");
此时头文件为:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
现在发现内存泄露的问题迎刃而解了。看来学会使用最新的版本还是很重要的。