У меня есть проблемы с управлением памятью в 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, чтобы повторно использовать его столько раз, сколько необходимо?
Заранее благодарим за ваш ответ.
Thx для этого, но в этом случае я не хочу выпускать память, но только очищаю ее, чтобы продолжать использовать одно и то же хранилище. – Tulkkas
Какова ошибка, возвращаемая 'cvClearMemStorage()'? – karlphillip
На самом деле cvClearMemStorage() не возвращает никаких ошибок, но после очистки программа вылетает из строя. Кажется, что clearMemStorage() каким-то образом вмешивается в то, что указывает на это хранилище не только путем очистки самого хранилища, но и удаления зависимостей. – Tulkkas