解决JavaOpenCV的内存问题
生活随笔
收集整理的這篇文章主要介紹了
解决JavaOpenCV的内存问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
???????? 在使用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的内存问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建行转账手续费 建行转账手续费怎么算
- 下一篇: 股票的委比是什么意思