Очистка памяти OpenCv для повторного использования - PullRequest
0 голосов
/ 26 марта 2012

У меня проблема с управлением памятью в openCV после использования функции:

cvCreateMemStorage (0);

Вот что я хочу сделать: я зацикливаюсь на многих изображенияхи я использую cvExtractSurf () для извлечения ключевых точек и дескрипторов.Я делаю это для каждого кадра и для каждых двух кадров, я делаю определенную обработку.Мне нужно всего лишь сохранить два кадра в памяти, поэтому я создал память с помощью:

cvCreateMemStorage (0);

Я хотел бы, чтобы после завершения обработки каждого кадра полностью очистить память вДля повторного использования, чтобы сохранить ключевые точки и дескрипторы следующего кадра.Мне нужно сделать это, потому что я обрабатываю много кадров и, следовательно, создание огромного объема памяти не лучший вариант.

Я пытался использовать cvClearMemStorage (), cvClearSeq () и cvRelease ()но ничего не работает, и я всегда в конечном итоге с ошибками.Вот код с важной частью (я удалил всю строку, не связанную непосредственно с квестом, поэтому, конечно, этот код не скомпилируется):

CvMemStorage* storageSrc = cvCreateMemStorage(0);
CvMemStorage* storageDest = cvCreateMemStorage(0);



// loop on all .bmp files in the selected directory
cout << "STARTING READING THE FRAME" << endl;
while(myHandle!=INVALID_HANDLE_VALUE && myFile.cFileName!= buffer){

    buffer=myFile.cFileName;
    fileLocation = dirName + buffer;
    frameNames.push_back(fileLocation);

    frame = cvLoadImage(fileLocation.c_str(), CV_LOAD_IMAGE_COLOR);
    frameResized = cvCreateImage(cvSize(processingSizeX, processingSizeY), 8, 3);
    cvResize(frame, frameResized, CV_INTER_AREA);

    resizedGray = cvCreateImage(cvSize(processingSizeX, processingSizeY), 8, 1);
    cvCvtColor( frameResized, resizedGray, CV_RGB2GRAY );

    if(!frame){
        fprintf(stderr, "Error when loading the images.");
        exit(-1);
    }


    if(nbFrameRead == 0){

        cout << endl;
        cout << "ZONE 1" << endl;
        cout << endl;

        cvSetImageROI( correspond, cvRect( 0, 0, processingSizeX, processingSizeY) );
        cvCopy( frameResized, correspond );
        cvResetImageROI( correspond );

        cvExtractSURF( resizedGray, 0, &srcFrameKeypoints, &srcFrameDescriptors, storageSrc, params );

        nbFrameRead++;


    }
    else if(nbFrameRead == 1){


        cout << endl;
        cout << "ZONE 2" << endl;
        cout << endl;



        cvExtractSURF( resizedGray, 0, &destFrameKeypoints, &destFrameDescriptors, storageDest, params );
        //printf("Nb Key Points in frame %d: %d\n", nbFrameRead, srcFrameDescriptors->total);


        // clear memory and switch current frame to last frame
        cvClearSeq(srcFrameKeypoints);
        cvClearSeq(srcFrameDescriptors);
        cvClearSeq(descriptorsOrderedSrc);
        cvClearMemStorage(storageSrc);
        srcFrameKeypoints = cvCloneSeq(destFrameKeypoints, storageSrc);
        descriptorsOrderedSrc = cvCloneSeq(descriptorsOrderedDest, storageSrc);
        cvClearSeq(destFrameKeypoints);
        cvClearSeq(destFrameDescriptors);
        cvClearSeq(descriptorsOrderedDest);
        cvClearMemStorage(storageDest);


        cvSetImageROI( correspond, cvRect( 0, 0, processingSizeX, processingSizeY) );
        cvCopy( frameResized, correspond );
        cvResetImageROI( correspond );

        nbFrameRead++;


    }
    else if(nbFrameRead < bufferSize + 2){

        cout << endl;
        cout << "ZONE 3" << endl;
        cout << endl;


        cvExtractSURF( resizedGray, 0, &destFrameKeypoints, &destFrameDescriptors, storageDest, params );
        //printf("Nb Key Points in frame %d: %d\n", nbFrameRead, srcFrameDescriptors->total);

        //clear memory and switch current frame to last frame
        cvClearSeq(srcFrameKeypoints);
        cvClearSeq(srcFrameDescriptors);
        cvClearSeq(descriptorsOrderedSrc);
        cvClearMemStorage(storageSrc);
        srcFrameKeypoints = cvCloneSeq(destFrameKeypoints, storageSrc);
        descriptorsOrderedSrc = cvCloneSeq(descriptorsOrderedDest, storageSrc);
        cvClearSeq(destFrameKeypoints);
        cvClearSeq(destFrameDescriptors);
        cvClearSeq(descriptorsOrderedDest);
        cvClearMemStorage(storageDest);

        nbFrameRead++;

    }
    else{

        cout << endl;
        cout << "ZONE 4" << endl;
        cout << endl;


        cvExtractSURF( resizedGray, 0, &destFrameKeypoints, &destFrameDescriptors, storageDest, params );


        // clear memory and switch current frame to last frame
        cvClearSeq(srcFrameKeypoints);
        cvClearSeq(srcFrameDescriptors);
        cvClearSeq(descriptorsOrderedSrc);
        cvClearMemStorage(storageSrc);
        srcFrameKeypoints = cvCloneSeq(destFrameKeypoints, storageSrc);
        descriptorsOrderedSrc = cvCloneSeq(descriptorsOrderedDest, storageSrc);
        cvClearSeq(destFrameKeypoints);
        cvClearSeq(destFrameDescriptors);
        cvClearSeq(descriptorsOrderedDest);
        cvClearMemStorage(storageDest);


        nbFrameRead++;
        nbFrameSmoothed++;


    }

    FindNextFile(myHandle,&myFile);
}

Что-то не так в этом коде?Если да, что я должен сделать, чтобы иметь возможность полностью очистить storageSrc и storageDest, чтобы использовать его столько раз, сколько необходимо?

Заранее благодарен за ответ.

1 Ответ

0 голосов
/ 26 марта 2012

Аналог cvCreateMemStorage() равен cvReleaseMemStorage().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...