2012-03-26 3 views
0

У меня есть проблемы с управлением памятью в OpenCV после использования функции: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); 
} 

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

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

ответ

0

Аналогий cvCreateMemStorage() является cvReleaseMemStorage().

+0

Thx для этого, но в этом случае я не хочу выпускать память, но только очищаю ее, чтобы продолжать использовать одно и то же хранилище. – Tulkkas

+0

Какова ошибка, возвращаемая 'cvClearMemStorage()'? – karlphillip

+0

На самом деле cvClearMemStorage() не возвращает никаких ошибок, но после очистки программа вылетает из строя. Кажется, что clearMemStorage() каким-то образом вмешивается в то, что указывает на это хранилище не только путем очистки самого хранилища, но и удаления зависимостей. – Tulkkas

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