Освобождение памяти OpenCV, правильное распределение / освобождение памяти (управление) в структурах OpenCV в функции - PullRequest
1 голос
/ 08 марта 2012

Я вызываю следующую функцию внутри класса внутри потока в цикле (захватывает кадры с камеры и затем обрабатывает их):

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член класса, а также другой, не объявленный в переменных функции.Кто-нибудь видит, что не так с созданием / освобождением памяти (выделением / освобождением) в функции?Почему утечка памяти.Заранее большое спасибо за вашу помощь.Пол

...