OpenCV在循环中调整大小 - 内存泄漏

时间:2015-11-17 18:08:40

标签: c++ opencv

我试图调整存储在向量中的Mats的大小。因此,我希望将所有已调整大小的Mats存储在原始向量中。在for循环中使用resize(original_mat, original_mat ....)会导致内存泄漏。同样的事情是当我使用下面的代码时 - 循环行为就像整个矢量被复制并存储在内存中一样。

Mat temp;
for (int i=0; i< im.size();i++){
    resize(im[i],temp,size,0,0,CV_INTER_LINEAR);
    im[i] = temp.clone();
}

有没有办法避免复制整个矢量并仅为单个Mats分配内存?提前谢谢。

编辑: 在调整大小之前我对输入帧执行了大量操作(例如 - 下采样),所以我试着看看当我在读取视频后立即调整帧形式向量时会发生什么。所以,我做到了:

VideoCapture input_file(input_filename);
int number_of_frames = input_file.get(CV_CAP_PROP_FRAME_COUNT);
vector <Mat> im;
for (int i=0; i<number_of_frames; i++){
    Mat frame;
    bool isFrame = input_file.read(frame);
    im.push_back(frame);
    frame.release();
}
Mat temp;
for (int i=0; i< im.size();i++){
    resize(im[i],temp,Size,0,0,CV_INTER_LINEAR);
    im[i] = temp.clone();
}

现在内存在第一个for循环中泄漏,这使我的问题类似于:out of memory when reading file(我也使用OpenCV 3.0.0)。 所以,我认为我只是被迫避免将我的整个视频保存在矢量中。

1 个答案:

答案 0 :(得分:0)

frame.release();会在释放帧的实际数据时出现问题。向量中的项目将只包含没有数据的标题。

请注意,当您将项目推送到向量时,将调用该项目的复制构造函数。 Mat的复制构造函数是浅拷贝而不是深拷贝,这意味着只复制头部并且不会发生深拷贝。换句话说,Mat都会引用相同的实际数据。

一定不能有任何内存泄漏。你怎么知道有内存泄漏?如果您使用的是分析器,则可能是错误的。如果你正在观看内存使用并看到它显着增加,这是正常的,因为你在没有任何编码的情况下将视频存储在内存中。这意味着每个帧可以是5-6 MB,基本数学:5(MB)* 30(FPS)* 60(秒)〜每分钟9 GB 。 所以没有内存泄漏,内存中存在大量数据并且它们不一样。