2012-01-27 23 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

+2

最初の2つは "foo = Mat();" "foo.release();"で?私は3番目のコードを実行するコードを見て泣くだろう。 ;) – cape1232

3

Mat :: release()はこのトリックを行う必要があります。

CF:あなたのデータを指している唯一の行列を使用している場合OpenCV Memory Management Documentation

+0

Mat.release()は参照カウンタを減らします。カウンタがゼロのときだけメモリを解放します。 – Sam

+1

実際には、空のMat()が各変数にデータを参照して割り当てられている場合、選択されたソリューションは何をしていますか? – cape1232

関連する問題