OpenCv内存清除以供重用

OpenCv Memory clearing for reuse

本文关键字:内存 清除 OpenCv      更新时间:2023-10-16

使用以下函数后,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: %dn", 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: %dn", 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,以便根据需要多次重复使用它?

提前感谢您的回答。

cvCreateMemStorage()的对应物是cvReleaseMemStorage()