java opencv bytearray转mat_OpenCV开发中的内存管理问题
点击上方蓝字关注我们
微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
引子
2020年第二篇技术文章,最近比较忙,事情比较多,搞了一个新的系列技术文章,还没有完整的搞好,抽空写一篇最近别人问我的事情!
概述
如果你是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 2#include 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 here16 m1.release();17 return m1;18}
总结
使用C++开发,内存跟指针问题是很多开发者头疼的一件事情,OpenCV框架对内存的管理已经很智能化了,基本上代码规范写,记得release就不会有这个方面的问题,但是还是小心为妙,特别是跨语言调用的时候比如Android/Java通过JNI调用OpenCV函数,如果不注意release或者没有正确release,很难找到原因!
最重要的一句话,记得release/free,欢迎留言分享你的观点与想法!
推荐阅读
2019原创技术文章汇总
2018年原创技术文章汇总
OpenCV实战 | 噪声生成与图像加噪声
OpenCV4系统化学习路线图-视频版本!
java opencv bytearray转mat_OpenCV开发中的内存管理问题相关推荐
- 拒绝内存泄露,谈一些纯代码iPhone开发中的内存管理
笔者刚从学校出来,算上实习期,接触iPhone开发已有半载,也算是对iPhone(iOS)开发中的内存管理有了些认识,由于开发中一直没有用Interface Builder,本文就谈谈纯代码iPhon ...
- Unity游戏开发中的内存管理_资料
http://mp.weixin.qq.com/mp/homepage?__biz=MzAwMTUzOTczNQ==&hid=6&sn=44228b7260d7a5a3287a4499 ...
- Swift 中的内存管理详解
这篇文章是在阅读<The Swift Programming Language>Automatic Reference Counting(ARC,自动引用计数)一章时做的一些笔记,同时参考 ...
- JVM基础 之Java HotSpot虚拟机中的内存管理
1 简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...
- Web开发中的图片管理:策略与实践
前言 在Web开发中,图像是无法忽视的重要组成部分.然而,随着图片数量的增加和高清图像的普及,图片管理变得越来越复杂.在这篇文章中,我们将详细探讨Web开发中的图片管理策略和实践,包括图片优化.存储. ...
- 形式参数内存在哪java_深入浅出Java中JVM内存管理
原标题:深入浅出Java中JVM内存管理 Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC ...
- java jvm内存模型_Java(JVM)内存模型– Java中的内存管理
java jvm内存模型 Understanding JVM Memory Model, Java Memory Management are very important if you want t ...
- 分布式存储开发:Curve中的内存管理
前言 Curve 实践过程中遇到过几次内存相关的问题,与操作系统内存管理相关的是以下两次: chunkserver 上内存无法释放 mds 出现内存缓慢增长的现象 内存问题在开发阶段大多很难发现,测试 ...
- 游戏开发中的道具管理
前言 在开发游戏的时候,我们肯定会处理道具,不论是多大的游戏都有道具.道具的管理方式也是多种多样.下面记录一下我个人在游戏开发中的道具管理方式. 道具的定义 道具的属性基本分为: ID.类型.数量.图 ...
最新文章
- 看人装X,我就来气,开启极限装X模式
- 操作Docker容器
- 网络:HTTP1.1和HTTP2区别
- Java探索之旅(6)——对象和类
- Kafka:集群部署
- leetcode —— 面试题 16.19. 水域大小
- ASP.Net Web 服务 – 如何使用会话状态
- C/C++ 控制台输入
- Linux的slab和nginx的区别,nginx中slab机制理解
- bochs运行xp_bochs xp 镜像下载|bochs xp精简版下载_ - 极光下载站
- rfid水洗电子标签怎么管理洗涤衣物
- xml转json(使用工具)
- 面试题-取出url中的参数以json对象结构输出(JavaScript)
- 分页虚拟存储管理——页面置换算法例题
- EasyExcel报错空指针异常
- 深入BBN,如何解决长尾数据分布的同时兼顾表示学习
- 查看github星数排行榜
- 点盾云播放视频没声音了怎么办?
- DHU OJ 27 约瑟夫环
- 干货 | 携程微信小程序如何进行Size治理
热门文章
- 即将直播:新一代大数据技术构建PB级云端数仓实践
- 腾讯AI Lab宣布将于9月底开源“Tencent ML-Images”项目
- FFMPEG使用参数详解
- linux 调优篇 :硬件调优(BIOS配置)* 壹
- go语言for循环中修改临时变量无效
- 如何将rdd导入数据库中【简单实例】
- Hadoop 03_核心:读写流程
- java小编程----电话号码组合
- leetcode 43. Multiply Strings | 43. 字符串相乘(Java)
- 遇到的坑_新手搭建web自动化遇到的坑...