Insufficient memory<failed to allocate 232852> in cv::OutOfMemoryError

本文针对使用OpenCV处理大量图像时出现的内存泄漏问题提供了解决方案。通过介绍图像、轮廓算子及矩阵的正确创建与释放方法,帮助读者有效管理内存资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ACMSunny

赠人玫瑰,手有余香。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值