批注怎么改不了,看下圖,怎么破?(批注無法顯示怎么辦)
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;i
{
cvGetRow(a,b,i);
}
//這樣a的第i行會復制一份然后替換掉原始的b->data.這樣也就造成了這一部分的內存泄漏。正確的作法是:
for(..)
{
cvReleaseData(b);
cvGetRow(a,b,i);
}
呃,按說這些東西openCV應該能封裝好了,并且這么重要的東西它也不在文檔中寫明。看著不多,寫出的程序如果循環起來就不知道泄漏多少內存了。。。。。。
此外,再向大家推薦一個內存泄漏的檢查工具:IBM Rational Purify.
==================================================================
Opencv各種內存泄露情況的總結?、Opencv各種內存泄露情況的總結2、
OpenCV 中文論壇 OpenCV中的內存泄漏檢測
===========================================================
C++ IDE OpenCV
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。