`
bcyy
  • 浏览: 1823613 次
文章分类
社区版块
存档分类
最新评论

【OpenCV】有关内存释放的一些问题

 
阅读更多

转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7586847

前一天把系统整个重写了一遍,脉络清晰了很多,也终于解决了以前很多崩溃,异常退出的问题。这里小小总结一下自己遇到的麻烦。

1、内存泄露

内存泄露是说没有释放已经不能使用的内存,这里一般指堆的内存才需要显示的释放。比如用malloc,calloc,realloc,new分配的内存是在堆上的,需要用free,delete显示的回收。内存泄露最明显的一是程序很慢,在运行程序时你可以启动任务管理器,会看到程序占用的内存一直“砰砰砰”的往上涨:


最后直接崩溃,或者你关闭程序的时候也会异常退出,出现

Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

之类的问题。

除了new的对象我们知道要delete。OpenCV中使用cvCreateImage()新建一个IplImage*,以及使用cvCreateMat()新建一个CvMat*,都需要cvReleaseImage() cvReleaseMat()显示的释放

IplImage* subImg=cvCreateImage( cvSize((img->width)*scale,(img->height)*scale), 8, 3 );
CvMat *tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scale,CV_MAKETYPE(image->depth,image->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);
另外一些函数要用到 CvSeq*来存放结果(通常这些都要用cvCreateMemStorage()事先分配一块内存CvMemStorage*),都要是释放掉相应的内存,这是很难找的。

比如从二值图像中寻找轮廓的函数cvFindContours():

CvMemStorage* m_storage=cvCreateMemStorage(0);
CvSeq * m_contour=0;
cvFindContours( img, m_storage, &m_contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
//释放内存
cvReleaseMemStorage(&m_storage);

以及人脸识别中检测人脸的函数:

CvMemStorage* m_storage=cvCreateMemStorage(0);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
CvSeq* faces = cvHaarDetectObjects( img, cascade, m_storage,1.1, 2, 0,cvSize(30, 30) );
//释放内存
cvReleaseMemStorage( &faces->storage);
cvReleaseHaarClassifierCascade( &cascade );

注意这里我们可以使用
cvReleaseMemStorage( &faces->storage);
来释放m_storate,也可以使用:
cvReleaseMemStorage(&m_storage);
释放内存,这是等效的,但一定不要用两次!!

2、一块内存多次释放

对应没有释放内存,对应就是一个内存释放多次,如同上面的 cvReleaseMemStorage用了两次。可能报错的地方:

__declspec(noinline)
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
    /* assign 0 to _debugger_hook_dummy so that the function is not folded in retail */
    (_Reserved);
    _debugger_hook_dummy = 0;
}
或者: Unhandled exception at XXXXXXXXXX in XXX.exe: XXXXXXXXXXX: 堆已损坏。


除了上述的MemStorge问题,使用cvQueryFrame()取出CvCapture*每帧图像,只需在最后释放CvCapture*,不需要释放IplImage*

CvCapture* pCapture = cvCreateCameraCapture(-1);
IplImage* pFrame=cvQueryFrame( pCapture );
cvReleaseCapture(&pCapture);

*这篇是以前写的,其实还是建议大家用C++接口的OpenCV,内存问题很少了~

分享到:
评论

相关推荐

    OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)【转】

    OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage) 在利用opencv时,有时候即使你觉得释放了资源,依然会造成内存泄露,原因究竟何在,这里给你答案!

    Opencv 动态内存的管理

    OpenCV在使用动态生长结构时,存储管理的方式很重要,要好好的理解

    opencvmem:OpenCV Java内存管理

    这是一个NetBeans 8 Java项目,展示了与OpenCV Java绑定有关的各种内存问题。 我使用NetBeans是因为它具有出色的分析器。 我的Ubuntu / Debian安装脚本修补了OpenCV源代码,以防止本文所述的问题。 如果您使用的是...

    opencv学习资料

    4.1 1、图像的内存分配与释放 4.1.1 (1) 分配内存给一幅新图像: 4.1.2 (2) 释放图像: 4.1.3 (3) 复制图像: 4.1.4 (4) 设置/获取感兴趣区域ROI: 4.1.5 (5) 设置/获取感兴趣通道COI: 4.2 2、图像读写 ...

    openCV 之 读取视频

    释放为 CvCapture结构体开辟的内存空间 关闭打开的 AVI文件相关的文件句柄 读取摄像头 只需把 cvCreateFileCapture 改成cvCreateCameraCapture即可。 该函数的输入参数是一个 ID号,只有存在多个摄像头时才起...

    OpenCV_编程简介(入门必读)

    掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。 目录  [隐藏] 1 一、简介 1.1 1、OpenCV的特点 1.1.1 (1) 总体描述 1.1.2 (2) 功能 1.1.3 (3) OpenCV模块 1.2 2、有用的学习资源 ...

    ffmpeg.zip_FFmpeg 内存_JMdecode_ffmpeg open_opencv_ffmpeg_视频帧

    基于ffmpeg的视频解码类,支持OpenCV的IpliImage的视频帧输出, 由用户释放IplImage内存

    cuda结合opencv实现图像的高斯平滑

    应用CUDA,opencv实现图像的高斯平滑处理, 读取待处理的图像; 定义中间数据传递的指针并分配内存; 将数据从Host端传到Device端; 网格和块的分配; 执行kernel函数; 将数据从Device端传回到... 最后释放内存。

    OpenCV C++完整的车牌识别系统.rar

    注意 手工分配内存的清除 和CDC对象的删除 以释放系统的GDI资源 每一个new操作符都要对应一个delete 虽然已经弄出来了,还是希望大家好好读读源程序。 你们以后的工作: 在菜单中添加菜单项,通过ClassWizzard ...

    OpenCv函数库

    5、cvReleaseImage:释放图像文件所分配的内存; 6、cvDestroyWindow:销毁显示图像文件的窗口; 7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件; 8、cvQueryFrame:用来将下一帧视频文件载入内存;

    OpenCV 中文开发文档

    图像数据操作(内存分配与释放,图像复制、设定和转换) Image data manipulation (allocation, release, copying, setting, conversion). 图像/视频的输入输出(支持文件或摄像头的输入,图像/视频文件的输出) ...

    opencv3.3.0-src2.rar

    该接口用于消除opencv中生成的vector变量的内容,这样保证在同一模块中释放内存,从而防止程序崩溃。 对应的库:https://download.csdn.net/download/jszj/10579260,由于这个库上传的时候没有带上这个修改了的...

    OpenCV 2.0函数释义列表

    1、cvLoadImage:将图像文件加载至内存;...5、cvReleaseImage:释放图像文件所分配的内存; 6、cvDestroyWindow:销毁显示图像文件的窗口; 7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件;

    释放指定文件占用cache的方法

    通过代码实现释放linux 系统特定文件占用的cache内存的方法

    毕业设计:人脸识别打卡系统,采用qt + opencv + mysql技术架构.zip

    3.一定程度上简化了内存回收机制 (特定场景下会帮助释放内存) 4.开发效率高,能够快速的构建应用程序。 5.可以进行嵌入式开发 ① 在要对文件进行加密解密的时候,先将文件按一定的数据结构读入内存,然后进行加密...

    毕业设计项目:基于QT4+Opencv开发的道路偏移检测与预警系统.zip

    3.一定程度上简化了内存回收机制 (特定场景下会帮助释放内存) 4.开发效率高,能够快速的构建应用程序。 5.可以进行嵌入式开发 ① 在要对文件进行加密解密的时候,先将文件按一定的数据结构读入内存,然后进行加密...

    FHOG:Felzenszwalb HOG(FHOG)特征提取器,用于C ++

    此外,功能图内存不会自动释放。 该存储库使用OpenCV3重写了C ++中的FHOG代码。 要求 OpenCV 3+(OpenCV2应该可用,但未经测试) 用法 # include " fhog.h " ... FHOG fhogDescripter; // This can be called ...

    iOS内存错误EXC_BAD_ACCESS的解决方法

    iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。 首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源...

    STM-Training:时空记忆网络的训练脚本

    python-opencv 枕头 yaml ga 雅克 进步 (可选) GPU支持 GPU内存> = 12GB CUDA> = 10.0 数据 有关准备好的数据集的数据组织的更多详细信息,请参见doc 。 释放 我们在代码库中提供了具有不同主干的预训练模型...

Global site tag (gtag.js) - Google Analytics