日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

解决JavaOpenCV的内存问题

發布時間:2023/12/31 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决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的内存问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。