Явно выпуская Mat с opencv 2.0 - PullRequest
       7

Явно выпуская Mat с opencv 2.0

3 голосов
/ 27 января 2012

Я работаю над программой, в которой мы выполняем некоторую обработку изображений с полнокачественных фотографий с камеры с помощью Android NDK. Итак, очевидно, что использование памяти является большой проблемой.

Бывают случаи, когда мне больше не нужно содержимое мата - я знаю, что он будет выпущен автоматически, когда выйдет за рамки видимости, но есть ли хороший способ выпустить его раньше, поэтому я могу уменьшить использование памяти?

Сейчас он отлично работает на моем Galaxy S II, но, очевидно, это не отражает возможности многих старых телефонов!

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Если у вас есть только одна матрица, указывающая на ваши данные, вы можете сделать этот трюк:

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);
3 голосов
/ 27 января 2012

Mat :: release () должен помочь.

ср .: Документация по управлению памятью OpenCV

...