当前位置:网站首页>OpenCV开发中的内存管理问题
OpenCV开发中的内存管理问题
2022-08-02 19:32:00 【小白学视觉】
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
概述
如果你是OpenCV框架做开发、特别是用OpenCV C++版本或者Java/Android版本JNI的调用的化,可能很多时候你遇到最棘手的问题就是程序运行会越来越慢,甚至死机了,原因很简单,有时候你有内存泄漏问题。做好下面几件事情会帮助你在开发中经可能的避免OpenCV对象内存泄漏陷阱。
记得调用release
OpenCV中很多数据结构与对象都有一个release方法,记得用完这些对象跟数据容器之后调用release/destory方法。最典型的就是Mat对象的release方法,调用release并不会重根本上保证立刻回收内存,它只是让对象的引用计数减一,只有当对象的引用计数为0的时候,才会回收内存。此外release方法还是一个原子操作,也可以线程中被调用。这些方法对象列表如下:
Mat的release方法,表示释放图像内存
FileStorage的releaseAndGetString方法,表示关闭文件,释放所有内存
Mat继承类/封装类,UMat、SparseMat等都调用release方法
VideoCapture/VideoWriter方法,调用release释放缓冲区与资源
CUDA相关的调用releaseMemory方法,比如SURF_CUDA
rgbd相关的调用releasePyramids方法
使用allocate分配内存的必须调用free()方法
对照一下,你平时有注意过这些不,没有的话从现在开始还来得及的!
滥用/重用变量导致内存泄漏
注意要避免下面三种错误代码写法
错误一:
1Mat m1;
2for (int i = 0; i < 100; i++) {
3 m1 = Mat::zeros(Size(512, 512), CV_8UC3);
4}
5imshow("input-m1", m1);
6m1.release();
错误方式:在循环中创建无数Mat对象,结果只释放了一个,很多人的循环就是这么写的,妥妥的内存泄漏!类似的代码操作应该避免。
错误二:
1Mat image = imread("D:/images/test.png");
2image = getProcessed();
3imshow("input-image", image);
错误方式:以为可以少创建一个变量,结果是无法释放内存了,反复调用导致内存泄漏,类似的代码应该避免。
错误三:
有返回Mat对象,但是提前调用release释放了,结果再次访问data数据块,导致程序直接崩溃!需要特别注意!简单演示如下:
1#include <opencv2/opencv.hpp>
2#include <iostream>
3
4using namespace std;
5using namespace cv;
6Mat my_process();
7int main(int argc, char** argv) {
8 // 错误三:
9 Mat image = my_process();
10 imshow("input-image", image);
11 waitKey(0);
12}
13Mat my_process() {
14 Mat m1 = Mat::zeros(Size(512, 512), CV_8UC3);
15 // TODO: do something here
16 m1.release();
17 return m1;
18}
总结
使用C++开发,内存跟指针问题是很多开发者头疼的一件事情,OpenCV框架对内存的管理已经很智能化了,基本上代码规范写,记得release就不会有这个方面的问题,但是还是小心为妙,特别是跨语言调用的时候比如Android/Java通过JNI调用OpenCV函数,如果不注意release或者没有正确release,很难找到原因!
最重要的一句话,记得release/free,欢迎留言分享你的观点与想法!
好消息!
小白学视觉知识星球
开始面向外开放啦
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
边栏推荐
猜你喜欢
随机推荐
E. Add Modulo 10(规律)
[安洵杯 2019]easy_web
【LeetCode】1374. 生成每种字符都是奇数个的字符串
You want the metagenomics - microbiome knowledge in all the (2022.8)
线性表(顺序表和链表)
Parse the commonly used methods in the List interface that are overridden by subclasses
el-tree渲染大量数据的解决方案(不通过懒加载)
Introduction of uncommon interfaces of openlayers
斯堪尼亚SCANIA OTL标签介绍
日志框架学习
如何ES源码中添加一个自己的API 流程梳理
一款好用的FAQ搭建工具
EMQX Newsletter 2022-07|EMQX 5.0 正式发布、EMQX Cloud 新增 2 个数据库集成
姑姑:给小学生出点口算题
NC | Structure and function of soil microbiome reveal N2O release from global wetlands
golang刷leetcode 经典(9)为运算表达式设计优先级
你想要的宏基因组-微生物组知识全在这(2022.8)
Caldera(一)配置完成的虚拟机镜像及admin身份简单使用
Electron使用指南之初体验
我用这一招让团队的开发效率提升了 100%!