2012-01-27 73 views
3

我正在開發一個程序,使用Android NDK對全質量相機照片進行一些圖像處理。所以,顯然內存使用是一個大問題。使用opencv 2.0明確發佈Mat

有時候我不再需要Mat的內容 - 我知道當它超出範圍時它會自動釋放,但是有一種很好的方式可以在早期釋放它,所以我可以減少內存使用量?

它現在在我的Galaxy S II上運行良好,但顯然這並不代表很多舊手機的功能!

回答

3

如果你只有一個矩陣指向你的數據,你可以做到這一點技巧:如果有多個墊指向你的數據

Mat img = imread("myImage.jpg"); 
// do some operations 
img = Mat(); // release it 

,你應該什麼做的是釋放所有的人

Mat img = imread("myImage.jpg"); 

Mat img2 = img; 
Mat roi = img(Rect(0,0,10,10)); 
// do some operations 

img = Mat(); // release all of them 
img2 = Mat(); 
roi = Mat(); 

或者使用推土機的方法:(?你確定這聽起來像是在你的代碼中插入錯誤)

Mat img = imread("myImage.jpg"); 

Mat img2 = img; 
Mat roi = img(Rect(0,0,10,10)); 
// do some operations 
char* imgData = (char*)img.data; 

free[] imgData; 

imshow("Look, this is called access violation exception", roi); 
+0

謝謝,我還沒有嘗試過,但它似乎是一個很好的方法! – Jords 2012-01-28 09:10:22

+2

前兩個不同於替換每個「foo = Mat();」與「foo.release();」?我會哭泣看代碼做第三個。 ;) – cape1232 2012-02-06 19:44:40

3

Mat :: release()應該可以做到。

參見:OpenCV Memory Management Documentation

+0

Mat.release()只是遞減引用計數器。只有當計數器爲零時纔會釋放內存。 – Sam 2012-01-27 06:30:19

+1

實際上,這是不是說選擇的解決方案在將空Mat()分配給每個變量並引用數據的情況下會做什麼? – cape1232 2012-02-06 19:45:41