opencv各種內存泄露情況的總結

      網友投稿 1074 2022-05-30

      以下文章共總結出cvLoadImage cvCloneImage cvGetRow 三個函數容易由于使用不當而泄露內存,要注意!

      OpenCV中的內存泄露問題(cvLoadImage函數)

      在做項目的過程中,使用OpenCV經常會出現一些內存泄露問題,自己編寫的程序出現問題還情有可原,但若是庫函數調用和使用時出現,卻很令我惱 火。花了好長時間和實踐的經驗告訴我應該客服它。下面把一些檢測出的問題進行化解。(可能是水平不夠,這些函數使用不當,望高手指點)

      cvLoadImage函數:

      可能大家還覺察不出來,但我深有體會,在程序中這個函數使用一次兩次感覺不來,但在處理序列圖像循環調用這個函數時,內存泄露的可能讓你目瞪口呆!即使你在最后使用cvReleaseImage(&pImg);進行了釋放,實驗證明:似乎不能成功釋放。

      解決方法:

      使用CvvImage類代替(詳見??CvvImage類參考手冊)。并且使用CvvImage類的Load函數。

      使用過程大概如下:

      //變量定義:

      CvvImage pSrcImg;

      IplImag *pSrcImgCopy ; //使用IplImag變量做個拷貝。畢竟IplImag 類處理方便。

      //獲取圖像:

      pSrcImg.Load(str); //str為Cstring類型的圖像文件名

      pSrcImgCopy = pSrcImg.GetImage(); //拷貝出pSrcImg的圖像數據。

      //釋放內存

      //pSrcImg變量不需要每次釋放,因為每次Load時是覆蓋以前的內存區域。pSrcImgCopy 同樣。

      //不過在程序結束時要釋放,以免產生內存泄露或者別人以為你忘了。

      cvReleaseImage(&pSrcImgCopy );

      pSrcImg.Destroy();

      //不過要正確釋放pSrcImgCopy 時,聲明時必須create下:

      pSrcImgCopy = cvCreateImage(cvSize(IMGWIDHT,IMGHEIGHT),IPL_DEPTH_8U, 3);

      //IMGWIDHT,IMGHEIGHT為圖像寬和高。

      OpenCV中的內存泄露問題(cvCloneImage函數)

      摘自:

      cvCloneImage函數:

      這個函數也會出現內存泄露!雖然可以釋放,但程序復雜不知道在那里釋放,因為它每次拷貝是制作圖像的完整拷貝包括頭、ROI和數據。不會覆蓋以前的內容。每次使用時編譯器會分配內存空間。一個752*480大小的圖像,每次泄露的內存大約為1M。

      解決方法:

      使用cvCopy函數代替。

      cvCopy(pSrcImg,pImg,NULL); //代替 pImg = cvCloneImage(pSrcImg);

      //pImg初始化時必須分配空間,否則上述函數不能執行。

      //pImg = cvCreateImage(cvSize(IMGWIDHT,IMGHEIGHT),IPL_DEPTH_8U, 3);

      IplImage* cvCloneImage( const IplImage* image );

      摘自

      大概調出來兩種情況造成的內存泄漏:

      1.在使用clone之前沒有對目標矩陣釋放。比如:

      CvMat* a = cvCreateMat(5,5,CV_32F);

      CvMat* b = cvCreateMat(5,5,CV_32F);

      ...

      a = cvCloneMat(b);

      這樣a所指向的那個mat就會泄漏出去了。

      正確的做法是在clone之前release掉原來的那個矩陣。并且注意在release之后將a置空。即:

      cvReleaseMat(&a); a=NULL;

      2.在使用cvGetRow,cvGetCols等函數時,沒有對目的矩陣的數據區釋放。比如:

      CvMat* a = cvCreateMat(5,5,CV_32F);

      CvMat* b = cvCreateMat(5,1,CV_32F);

      ...

      for(int i=0;iheight;i++)

      {

      cvGetRow(a,b,i);

      }

      //這樣a的第i行會復制一份然后替換掉原始的b->data.這樣也就造成了這一部分的內存泄漏。正確的作法是:

      for(..)

      {

      cvReleaseData(b);

      cvGetRow(a,b,i);

      }

      opencv各種內存泄露情況的總結

      呃,按說這些東西openCV應該能封裝好了,并且這么重要的東西它也不在文檔中寫明。看著不多,寫出的程序如果循環起來就不知道泄漏多少內存了。。。。。。

      此外,再向大家推薦一個內存泄漏的檢查工具:IBM Rational Purify.

      ==================================================================

      Opencv各種內存泄露情況的總結?、Opencv各種內存泄露情況的總結2、

      OpenCV 中文論壇 OpenCV中的內存泄漏檢測

      ===========================================================

      C++ IDE OpenCV

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:CSS實現水平垂直居中的常用方法
      下一篇:深源恒際與和諧健康保險達成合作 醫療票據OCR識別助力保險理賠駛入快車道
      相關文章
      亚洲AV无码乱码精品国产| 亚洲国产午夜精品理论片在线播放 | 亚洲入口无毒网址你懂的| 精品日韩亚洲AV无码| 亚洲男人第一av网站| 亚洲AV无码专区在线播放中文| 亚洲熟女一区二区三区| 中文字幕日韩亚洲| 久久精品国产亚洲精品| 亚洲综合亚洲综合网成人| 2048亚洲精品国产| 最新国产AV无码专区亚洲 | 亚洲精品国产高清嫩草影院| 色婷婷亚洲一区二区三区| 亚洲精品中文字幕| 在线视频亚洲一区| 亚洲国产精品综合久久网络| 亚洲国产综合精品一区在线播放| 亚洲精品国产自在久久| 亚洲第一视频在线观看免费| 亚洲成av人片不卡无码久久| 国产成人精品亚洲2020| 亚洲色大成网站www| 亚洲AV成人无码网站| 一本色道久久88亚洲综合| 亚洲男人天堂2020| 曰韩亚洲av人人夜夜澡人人爽| 亚洲国产另类久久久精品小说| 久久精品亚洲综合专区| 亚洲视频一区在线播放| 亚洲国产精品成人综合久久久| 中文字幕无码精品亚洲资源网久久 | 国产精品高清视亚洲一区二区| 亚洲欧美日韩国产成人| 亚洲av中文无码乱人伦在线观看| 亚洲成av人在片观看| 国产亚洲精品岁国产微拍精品| 午夜影视日本亚洲欧洲精品一区| 亚洲精品第五页中文字幕 | 一本色道久久综合亚洲精品| 亚洲国产精品VA在线看黑人 |