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

本文总结了在OpenCV编程中常见的内存管理问题,包括内存泄露和一块内存被多次释放的情况。对于内存泄露,强调了堆内存需要通过free或delete释放,并举例说明了如何正确使用cvReleaseImage()和cvReleaseMat()。而对于内存多次释放的问题,提到了可能导致错误的cvReleaseMemStorage()重复调用,以及在处理视频帧时,只需在最后释放CvCapture*,不需释放IplImage*。

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

转载请注明出处: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()  cvRelease

### 使用 `cvFindContours` 函数提取图像中的轮廓 在 OpenCV 中,`cvFindContours` 是用于检测二值图像中对象轮廓的强大工具[^1]。此函数不仅能够识别物体边缘,还可以根据指定模式构建这些边界的层次结构。 #### 轮廓检索模式的选择 不同的应用场景可能需要不同类型的轮廓信息: - **仅获取最外层轮廓**:如果目标是从复杂图形中分离出主要形状而不关心内部细节,则应采用 `cv::RETR_EXTERNAL` 参数设置。这将确保即使存在内嵌区域也只会获得外部边界数据[^2]。 - **全面捕捉所有轮廓**:对于那些希望记录每一个独立封闭曲线的情况来说,可以选择 `cv::RETR_TREE` 或者 `cv::RETR_LIST` 。前者除了提供完整的轮廓列表之外还会保存其间的父子关系;后者则仅仅列举发现的所有路径而忽略任何潜在联系。 下面是一个简单的 Python 实现例子来展示如何调用该方法并绘制找到的结果: ```python import cv2 import numpy as np # 加载灰度图并应用阈值处理得到二值化图片 image = cv2.imread('example.png',0) ret,thresh = cv2.threshold(image,127,255,cv2.THRESH_BINARY) # 查找轮廓 contours,hierarchy=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) # 创建空白画布准备绘制裁剪后的轮廓 drawing=np.zeros((thresh.shape[0], thresh.shape[1], 3), dtype=np.uint8) for i in range(len(contours)): color=(np.random.randint(0,256),np.random.randint(0,256),np.random.randint(0,256)) cv2.drawContours(drawing,[contours[i]],-1,color=color,thickness=2) cv2.imshow("Contours", drawing) cv2.waitKey() ``` 上述代码片段展示了如何读取一张名为 'example.png' 的文件作为输入源,在对其进行必要的预处理之后利用 `cv::findContours()` 方法寻找其中存在的实体,并最终通过随机颜色填充的方式可视化所获知的信息。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值