2015-05-29 4 views
3

При использовании openCV cv :: Mat. http://docs.opencv.org/modules/core/doc/basic_structures.html Я понимаю, что используются какие-то умные указатели. мой вопрос в том, чтобы сделать некоторую оптимизацию памяти.
Должен ли я вызвать cv :: Mat release(), чтобы освободить неиспользуемые матрицы?
или я должен доверять компилятору, чтобы сделать это?openCV cv :: mat release

, например, думаю, что этот код:

cv::Mat filterContours = cv::Mat::zeros(bwImg.size(),CV_8UC3); 
bwImg.release(); 
for (int i = 0; i < goodContours.size(); i++) 
{ 
    cv::RNG rng(12345); 
    cv::Scalar color = cv::Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
    cv::drawContours(filterContours,goodContours,i,color,CV_FILLED);   
} 

/*% Fill any holes in the objects 
bwImgLabeled = imfill(bwImgLabeled,'holes');*/ 


imageData = filterContours; 
filterContours.release(); //should I call this line or not ? 
+2

, когда матрица выходит за пределы области видимости, она будет отпущена (если нет данных о ссылках этой матрицы) – Micka

+0

@ Мика, что произойдет, если это очень длинная функция, когда вычисление требует времени. это поможет освободить? – Gilad

+1

это даст вам некоторую память назад, которая может или не поможет вам – Micka

ответ

2

cv::release() функция освобождает память, которая деструктор будет заботиться о конце объема например Мат в любом случае. Поэтому вам не нужно явно называть его в фрагменте кода, который вы разместили. Пример, когда это было бы необходимо, если размер матрицы может варьироваться в разных итераций в пределах одного цикла, то есть,

using namespace cv; 
int i = 0; 
Mat myMat; 
while(i++ < relevantCounter) 
{ 
    myMat.create(sizeForThisIteration, CV_8UC1); 

    //Do some stuff where the size of Mat can vary in different iterations\\ 

    mymat.release(); 
} 

Здесь, используя резюме :: Release() сохраняет компилятор от накладных создавая указатель в каждом цикле

Смежные вопросы