1、问题描述
近来需要跑一个稍微大一点的程序。需要反复读入程序,然后最终出现了如下的图片所示内容。
2、解决方案
(1)内存占据随着图片读的使用而逐渐变大。或许你是一次次的覆盖性的修改,但是,这些图像分配的空间在你的程序执行完结之前都是一直累积着的。一个752*480大小的图像,每次泄露的内存大约为1M[1]。
Every time you go through the loop, you create new buffers for eig_image
and temp_image
,
and leak the old ones. Those leaked buffers build up until you run out of memory.[2]
(2)所以需要不断的去释放使用过的内存,并回收那些内存。我还没有想到,自己的程序已经大的需要回收内存的地步了。
图像内存的创建与回收:
const char* imagename ="fire.bmp"; //将图像的名字赋值给imagename变量,方便后边的使用情况
IplImage * img = cvLoadImage(imagename);
if(!img)
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
cvReleaseImage(&img);
轮廓算子的创建于回收:
storage = cvCreateMemStorage(0);
int cntnum = 0; //cntnum是外接矩形框的个数
cntnum = cvFindContours(inputimg, storage, &contour, sizeof(CvContour),CV_RETR_EXTERNAL , CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));
cvReleaseMemStorage(&storage);//cvClearMemStorage(storage);
矩阵的创建与回收:
CvMat* SVMtrainMat=cvCreateMat(1,nDim,CV_32FC1);
//矩阵使用
cvReleaseMat(&SVMtrainMat);//使用完毕释放空间
3、参考文献和致谢
[1]http://blog.sina.com.cn/s/blog_67a7426a0101czyr.html
[2]http://stackoverflow.com/questions/4663789/error-insufficient-memory-opencv
[3]http://blog.youkuaiyun.com/fulva/article/details/7393043
[4]http://www.opencv.org.cn/forum.php?mod=viewthread&tid=31277