【问题标题】:OpenCv Memory clearing for reuseOpenCv 内存清除以供重用
【发布时间】:2012-03-26 03:31:13
【问题描述】:

使用该功能后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 以便根据需要多次重复使用它?

提前感谢您的回答。

【问题讨论】:

    标签: c++ memory-management opencv


    【解决方案1】:

    【讨论】:

    • 谢谢,但在这种情况下,我不想释放内存,只是清除它以继续使用相同的存储空间。
    • 其实 cvClearMemStorage() 并没有返回任何错误,但是在清理之后,程序崩溃了。似乎 clearMemStorage() 在某些方面干扰了指向该存储的内容,不仅通过清理存储本身而且还删除了依赖项。
    • 我已经升级到 openCV2.3.1 并且没有更多问题,因为关键点不是存储在序列中而是向量中,这使得它更容易。
    猜你喜欢
    • 2014-03-21
    • 2014-01-15
    • 2020-12-18
    • 1970-01-01
    • 2010-12-20
    • 2014-01-13
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多