gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:25 24 4
gpt4 key购买 nike

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

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

有没有办法避免复制整个 vector 并只为单个 Mats 分配内存?提前致谢。

编辑:在调整输入帧的大小之前,我对它们执行了很多操作(例如 - 下采样),所以我试图看看在阅读视频后立即调整帧形式 vector 时会发生什么。所以,我做了这个:

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)。所以,我认为我只是被迫避免将我的整个视频保存在一个 vector 中。

最佳答案

frame.release(); 会在您释放框架的实际数据时导致问题。 vector 中的项目将只包含一个没有数据的标题。

请注意,当您将项目 push_back 到 vector 时,将调用该项目的复制构造函数。 Mat 的复制构造函数是浅拷贝而不是深拷贝,这意味着只会复制 header 而不会发生深拷贝。换句话说,两个 Mat 将引用相同的实际数据。

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

关于c++ - OpenCV 在循环中调整大小 - 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33764039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com