cvReleaseImage 釋放內存出錯


 

cvReleaseImage是OpenCV中C語言庫中的釋放圖片內存的函數,比如我們加載或者克隆了一幅圖片,當不需要這幅圖片了時,我們為了避免內存泄露,需要釋放這些空間,可以參見我之前的博客OpenCV Show Image cvShowImage() 使用方法,其使用方法如下:

IplImage *img = cvLoadImage("Input.jpg");
cvNamedWindow("Image:",1);
cvShowImage("Image:",img);
cvWaitKey();
cvDestroyWindow("Image:");
cvReleaseImage(&img);

 

如上所示的cvReleaseImage的使用方法是沒有問題的,但是有兩種情況下使用cvReleaseImage來釋放內存會出錯,需要格外小心。

1. 當使用cvCaptureFromCAM函數時

這個函數是用OpenCV來打開攝像頭並捕捉攝像頭的圖像時需要用到的,可以參見我的另一篇博客中的代碼OpenCV show two cameras 同時顯示兩個攝像頭。這個函數會建立一個CvCapture的結構體,專門用來打開或關閉攝像頭的,在OpenCV的官方文檔中,我們會看到下面一段話:

Note: In C API, when you finished working with video, release CvCapture structure with cvReleaseCapture(), or use Ptr<CvCapture> that calls cvReleaseCapture() automatically in the destructor.

這告訴我們使用完了CvCapture,需要用cvReleaseCapture來釋放內存,那么我們就不需要再用cvReleaseImage來釋放每一張圖像的內存了。官方文檔中還有另一段注意事項:

Note :OpenCV 1.x functions cvRetrieveFrame and cv.RetrieveFrame return image stored inside the video capturing structure. It is not allowed to modify or release the image! You can copy the frame using cvCloneImage() and then do whatever you want with the copy.

這里明確指出了從攝像頭獲取的圖片不能被修改和釋放,所以如果我們對捕獲的圖像調用cvReleaseImage就會出錯。

 

2. 當從別的圖像類轉為IplImage格式時

另外一種不能使用cvReleaseImage的情況是,當我們使用別的SDK時,比如FlyCapture2中的f2Image圖像格式,或者是Qt5中的QImage圖像格式,我們自己寫函數將其轉為為OpenCV中IplImage格式時,可參見我的博客FlyCapture2 fc2Image OpenCV IplImage Conversion 兩種圖像格式之間的轉換,我們自己申請了一段unsigned char格式的內存來保存圖像數據,使用完了后要釋放的時候,也不能使用cvReleaseImage,會出錯。我們只能手動釋放內存,我們需要看申請這段內存使用的是new還是malloc,如果是new的內存,用delete來釋放,如果是malloc的內存,用free來釋放。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM