在使用OpenCV时,程序总是在某个时间墨明棋妙地终止,打开CygWin ,输入 adb logcat ,查看打印的信息,发现是内存问题。经过反复的查找,发现使用OpenCV的java类库时,一定要慎重使用New Mat()。

内存溢出的原因: 在循环中使用Java层的OpenCV,本质都需要深入到Native层。在使用New Mat(),进行初始化时,默认使用了C++的new()函数,但并没有同时使用Delete(),并且也无法确定初始化对象的作用域,导致大量的New()没有Delete(),造成内存溢出。

经过修改后的处理帧的函数是这样的:

  @SuppressLint("SdCardPath")public Mat onCameraFrame(CvCameraViewFrame inputFrame) {if(!inited)return inputFrame.rgba();//初始化OpenCVmRgba = inputFrame.rgba();mGray = inputFrame.gray();if (mTrack6Dof.mNativeObjCvT != 0 && mTrack6Dof.mCamParam!=null){if(mRgba.rows()>0 ){//经过一次分辨率转换!Imgproc.resize(mRgba, m_Mi, mRgba.size());Imgproc.cvtColor( mRgba,m_Mi, Imgproc.COLOR_BGRA2RGB);//确认是否调用原始视频!if(IsVideo == true){//1.获得红色追踪面的重心getSeqCentroid(m_Mi, mRgba);}else{if(G_Counter <1000 ){String filename ="/sdcard/DevCv/CircleBall/";filename +="Image" + G_Counter + ".png";Mat M =Highgui.imread(filename);//2.测试序列追踪//代码无修改,测试追踪没有响应代码,暂时不可行if( M.rows()>0 ){//3.测试球追踪refineYSeq( M,  mRgba);}G_Counter+=1;}else{IsVideo = false;}}}}return mRgba;}

所使用的函数:

 public int refineYSeq(Mat M, Mat mRgba){Point3 Centroid = new Point3();Centroid.x =0;Pattern.refineSeqJar(M,Centroid);if(Centroid.x !=0){Rect RCen = new Rect();RCen.height = 4;RCen.width  = 4;RCen.x = (int) ( Centroid.x );RCen.y = (int) ( Centroid.y );Point Center = new Point();Center.x = (int) ( Centroid.x );Center.y = (int) ( Centroid.y );RectMyMat(M,  Center, (float)4.0, FACE_RECT_COLOR ,2);}//Mat MT= new Mat( mRgba.rows(),mRgba.cols(),CvType.CV_8UC3);Imgproc.resize(  M, m_MT, mRgba.size() );Imgproc.cvtColor(m_MT, mRgba, Imgproc.COLOR_RGB2BGRA);return 1;}

所使用的全局变量:

 //初始化OpenCV载入状态和循环中使用的mat,把循环内的mat转化为全局,不在局部new mat型boolean inited = false;Mat m_Mi    = null;Mat m_edges = null;Mat m_MT    = null;

初始化OpenCV和局部变量:

//初始化OpenCV的callback函数:

private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {switch (status) {case LoaderCallbackInterface.SUCCESS:{Log.i(TAG, "OpenCV loaded successfully");        //System.loadLibrary("feelJulyGpsMap");// Load native library after(!) OpenCV initializationtry {{m_Mi    = new Mat(540,960,CvType.CV_8UC3);m_edges = new Mat(540,960,CvType.CV_8UC1);m_MT    = new Mat(540,960,CvType.CV_8UC3);Pattern   = new CMovePattern();PatternRf = new CMovePatternRf();}} catch (IOException e) {e.printStackTrace();Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);}//尝试几种方法,暂时不改正摄像机角度问题了!//camera.setDisplayOrientation(90); //mOpenCvCameraView.setRotationX(15);//立体旋转,旋转90度就成一条线了!wishchin!//mOpenCvCameraView.surfaceCreated(surfaceHolder Holder);mOpenCvCameraView.enableView();} break;default:{super.onManagerConnected(status);} break;}}};

总结:

避免使用OpenCV造成内存溢出的方法是:

把循环中需要初始化的变量移到全局,避免大量的New Mat() 出现;

1. 初始化为null;

2.初始化OpenCV后,再初始化Mat的大小;

3.在循环中使用全局Mat型,避免new 或者初始化!

解决JavaOpenCV的内存问题相关推荐

  1. datagenerator解决训练时候内存不足问题

    [Keras]使用数据生成器(data generators)解决训练数据内存问题_m0_37477175的博客-CSDN博客_datagenerator

  2. 【Linux】解决Linux服务器内存不足问题

    [Linux]解决Linux服务器内存不足问题 参考文章: (1)[Linux]解决Linux服务器内存不足问题 (2)https://www.cnblogs.com/haochuang/p/1191 ...

  3. chrome 占用大量内存直到网页崩溃_Chrome吃内存太夸张!几招解决Chrome占内存硬伤...

    我们知道Chrome是非常出色的浏览器,无论从性能还是功能的角度来看,都是如此.但是Chrome在内存占用方面的表现,就很令人头疼了!常常听到有朋友抱怨,想要上网找找素材,不一会儿发现Chrome已经 ...

  4. [转]解决mySQL占用内存超大问题

    [转]解决mySQL占用内存超大问题 参考文章: (1)[转]解决mySQL占用内存超大问题 (2)https://www.cnblogs.com/tusheng/articles/10619692. ...

  5. win8 计算机内存不足怎么办,如何解决Win8电脑内存不足的问题?

    Win8系统全新的界面及多样的功能,越来越多的用户开始选择使用Win8系统.不过,最近却有不少Win8用户反映自己的电脑明明内存够用,但系统总是提示电脑内存不足,这该怎么办?如何解决这样的问题呢?现在 ...

  6. 台式计算机内存是什么问题,如何解决台式机上内存不足的问题

    本文在Internet上组织,仅供阅读. 台式计算机提示内存不足. 如何解决台式计算机提示内存不足的问题: (1)开机自检,显示内存为1g,使用mem检查内存容量为1g,说明物理内存没有问题. (2) ...

  7. 解决 0X000000该内存不能为read 的方法

    解决" 0X000000该内存不能为read" 的方法现在有很多人在使用donghai制作的电脑公司ghost版的系统,经常会出现"0X000000该内存不能为read& ...

  8. mysql占用多少内存_解决mySQL占用内存超大问题

    解决mySQL占用内存超大问题 解决mySQL占用内存超大问题 为了装mysql环境测试,装上后发现启动后mysql占用了很大的虚拟内存,达8百多兆.网上搜索了一下,得到高人指点my.ini.再也没见 ...

  9. 解决Win11开机内存占用过高的情况

    解决Win11开机内存占用过高的情况 这几天使用电脑的时候发现有点卡顿,所以今早打开电脑先打开了任务管理器查看一下进程,发现我在没有运行任何应用的情况下,运行内存居然占用了42%..记得之前好像没这么 ...

最新文章

  1. 编写高质量代码改善C#程序的157个建议——建议148:不重复代码
  2. 2016年第31周四
  3. poj 1741 Tree
  4. The server time zone value
  5. VS2013 MFC基于对话框编程(创建工程)
  6. 怎么把原来的墙拆掉_家装拆除不是简单的砸砸墙,它也是有技术的
  7. LeetCode 1602. 找到二叉树中最近的右侧节点(BFS)
  8. 如何在Swift中使用CoreData设置有用的自动完成UITextField
  9. C++程序设计:原理与实践(进阶篇)15.4 链表
  10. matlab dicom图像异常,用Matlab处理Dicom图像
  11. weblogic安装错误BEA-090870解决方案
  12. 232接口针脚定义_VGA接口定义,详细图文资料
  13. 关于微信卡券网页跳转链接能力的下线
  14. android tv字体,android TV 屏幕适配 (一)
  15. 情人节送什么礼物给女友比较好、这几款就够了
  16. 记录一次夏令时和冬令时导致的项目BUG
  17. kubernetes lowB安装方式
  18. windows磁盘分区合并(比如合并到C盘/分区扩容)问题/删除恢复分区
  19. XINLINX VC707 的学习
  20. phpexcel中文手册(转)

热门文章

  1. editplus的使用技巧
  2. 20165105第三周学习总结
  3. windows和linux互传文件,用户配置文件和密码配置文件,用户和组管理
  4. 形参与实参, 值传递与引用传递, ref参数与out参数的区别和联系?
  5. Tech.Ed 2008
  6. 3/3 常用符号:转义字符
  7. c++ explicit
  8. 我的Notepad++环境配置
  9. 3.4.1 变量初始化
  10. BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化