Я вызываю следующую функцию внутри класса внутри потока в цикле (захватывает кадры с камеры и затем обрабатывает их):
CvRect ImageProcessor::detectFaceInImage(const IplImage *inputImg) //
{
IplImage *detectImg;
CvMemStorage* storage = 0;
CvRect *rc = 0;
CvRect rect;
double count;
CvSeq* rects = 0;
int l,n;
detection_time = (double)cvGetTickCount();
detectImg = cvCloneImage(inputImg);
if(fastDetectMode)
{
faceCascade = (CvHaarClassifierCascade*)cvLoad(
faceCascadeFile[0].toAscii().data(),
0,
0,
0
);
if( !faceCascade )
{
QMessageBox mbox;
mbox.setIcon(QMessageBox::Information);
mbox.setText("Can't load haar cascade face detector 0");
mbox.setStandardButtons(QMessageBox::Ok);
mbox.exec();
if(detectImg)
cvReleaseImage(&detectImg);
return cvRect(-1,-1,-1,-1);
}
for(l=0;l<10;l++) //10 different search scale factors ( 10 )
{
storage = cvCreateMemStorage(1000000); //0
rects = cvHaarDetectObjects(
detectImg,
(CvHaarClassifierCascade*)faceCascade,
storage,
search_scale_factor[l],
minNeighborhood[1],
flags[0],
minFeatureSize[0]
);
if(rects->total>0)
{
for(n=0;n<rects->total;n++)
{
rc = (CvRect*)cvGetSeqElem( rects, n );
if((rc->height > 0.1*faceHeight) && (rc->width>0.1*faceWidth))
{
if(detectImg)
cvReleaseImage(&detectImg);
if(faceCascade)
cvFree(&faceCascade);
count = (double)cvGetTickCount();
detection_time = (double)((count - detection_time) /
(double)cvGetTickFrequency())/1000000;
rect = *rc;
cvReleaseMemStorage(&storage);
return rect;
}
}
}
if(storage)
cvReleaseMemStorage(&storage);
}
cvFree(&faceCascade);
}
//nothing found:
rect = cvRect(-1,-1,-1,-1);
count = (double)cvGetTickCount();
detection_time = (double)((count - detection_time) /
(double)cvGetTickFrequency())/1000000;
if(detectImg)
cvReleaseImage(&detectImg);
return rect;
}
Я ожидаю, что каждый раз, когда я вызываю эту функцию, вся необходимая память для обнаружения желаемого лицарегион (прямоугольник cvRect) во входном изображении выделяется и освобождается после возврата функции.Но то, что происходит, когда я запускаю, это то, что в функции наблюдается утечка памяти, другими словами, ОЗУ (физическая память ПК) постоянно растет, когда я вызываю функцию в цикле.
faceCascade - это ImageProcessorчлен класса, а также другой, не объявленный в переменных функции.Кто-нибудь видит, что не так с созданием / освобождением памяти (выделением / освобождением) в функции?Почему утечка памяти.Заранее большое спасибо за вашу помощь.Пол