OpenCv内存清除以供重用
OpenCv Memory clearing for reuse
使用以下函数后,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()
。
相关文章:
- 如何使用内存集清除字符数组
- 清除在 main() 中分配的堆栈内存?
- 清除按矢量分配的内存
- 如果操作系统未清除内存泄漏,则在程序完成后内存泄漏是否仍然存在?
- C++ 清除动态阵列中的内存 - 内存无法清除
- 如何在C ++中清除已删除对象的内存?
- thread_local std::list 是否会在呼叫清除时放弃分配的内存
- 如何使用删除 [] 运算符清除动态分配的内存?(无法使用常规删除语法清除)
- 如何正确清除内存
- delete命令会清除用new分配的内存吗
- 与对象一起返回时清除了内存指针
- 有效清除矢量内存
- 为什么运算符 new 清除的内存多于请求的内存
- Do 函数在退出范围时清除动态内存
- 如何从内存中清除C++中的矢量
- 我使用三种内存清除变体.他们都安全吗?我可以得到内存泄漏吗?
- 在函数中返回向量后清除内存
- 引发异常时如何清除动态内存
- OpenCv内存清除以供重用
- 应用程序突然关闭时的堆内存清除