2012-03-26 63 views
0

我有在OpenCV中的存储器管理的问题使用函数后:OpenCV的存储器清除重用

cvCreateMemStorage(0);

这是我想要做的事情:我在许多图像上循环,我使用cvExtractSurf()来提取关键点和描述符。我为每一帧和每两帧我做了一定的处理。我只需要在内存中保留两帧,因此我使用以下命令创建了内存存储:

cvCreateMemStorage(0);

我想在每个帧上完成处理以完全清理内存,以便重用它来存储下一帧的关键点和描述符。我需要这样做,因为我正在处理大量帧,因此创建大量内存并不是最佳选择。我试图使用cvClearMemStorage(),cvClearSeq()和cvRelease(),但没有任何工作,我总是以错误结束。这里是重要组成部分的代码(我已删除了所有的线所以当然这段代码不会编译没有直接关系的questin):

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,以便根据需要尽可能多地重用它?

非常感谢您的回答。

回答

0
+0

Thx为此,但在这种情况下,我不想释放内存,但只清除它,继续使用相同的存储。 – Tulkkas 2012-03-27 06:08:16

+0

'cvClearMemStorage()'返回的错误是什么? – karlphillip 2012-03-27 12:50:31

+0

其实cvClearMemStorage()不会返回任何错误,但清理后,程序崩溃。看起来clearMemStorage()在某些方面干涉了这个存储的要点,不仅通过清理存储本身,还取消了依赖关系。 – Tulkkas 2012-03-30 00:24:30