C++ Mat::推回导致OpenCV内存泄漏

C++ Mat::推回导致OpenCV内存泄漏,c++,opencv,memory,C++,Opencv,Memory,我试图提取大约8000张图像的SIFT特征,并将它们放在一张垫子上 下面是我的代码: Mat feature, im, SIFTFeatures; char imgFile[50]; SiftFeatureDetector detector; SiftDescriptorExtractor extractor; for (int view = 0; view < imageNum; view++) { sprintf(imgFile, "image_%04d.jpg", view

我试图提取大约8000张图像的SIFT特征,并将它们放在一张垫子上

下面是我的代码:

Mat feature, im, SIFTFeatures;
char imgFile[50];
SiftFeatureDetector detector;
SiftDescriptorExtractor extractor;

for (int view = 0; view < imageNum; view++)
{
    sprintf(imgFile, "image_%04d.jpg", view+1);
    im = imread(imgFile);

    vector<KeyPoint> tmpKey;
    detector.detect(im, tmpKey);
    if (tmpKey.size() == 0){
        printf("%d\t%d no keypoints\n", obj, view);
        continue;
    }
    extractor.compute(im, tmpKey, feature);
    SIFTFeatures.push_back(feature);

    feature.release();
    im.release();
}
然后发生了一个错误,说明在分配大约800MB内存时内存不足。但我的笔记本电脑有16GB的内存,所以我想内存泄漏是在什么地方发生的

最有可能的是筛选特征

但我不知道为什么以及如何避免这个错误


我使用SIFTFeature的原因是我需要将所有功能添加到BowKMeanFilter以提取BOW功能。

Mat::分配器的工作原理与std::vector非常相似:只要没有足够的空间推回新元素,它的容量就会加倍。稍后,它会发现,它分配了太多的资源,并且会再次丢弃很多资源,但在短时间内,你会看到尖锐的“尖峰”,是的,如果你已经接近极限,最终会耗尽内存。你真的需要一个垫子吗?向量可能会避免这个问题,因为我需要向BowKMeanFilter trainer500添加所有功能。我还尝试了trainer.addfeature,但也出现了内存不足的错误。您是否尝试过在for循环中创建Mat的功能和im?您是否限制每个图像的功能数量?您是否尝试过使用较小的图像集进行训练?