首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV cv::Mat导致std::载体潜在内存泄漏

OpenCV cv::Mat导致std::载体潜在内存泄漏
EN

Stack Overflow用户
提问于 2013-08-12 14:41:08
回答 1查看 4.2K关注 0票数 1

现在,我试图以cv::Mats的形式保存一个完整的图像列表,然后再进行处理。现在我有一个看起来像这样的东西:

代码语言:javascript
运行
复制
do
{
 image = readimage();
 cv::Mat mat = cv::Mat((length, width, CV_8UC4, image));
 cv::Mat temp = mat.clone();
 saved_images.push_back();

 mat.release();
 temp.release();
 freeimagememory(image);
}
while(hasimage);

这真的很管用。对于非常小的图像列表,它会很好地存储它们。然而,当我看到大量的图像时,程序总是会崩溃,说是调用了Abort(),检查时它说它正在抛出一个cv::exception。

有人知道这是为什么吗?为了节省空间(克隆似乎很昂贵),我已经考虑过将向量改为指向cv::Mats的指针向量,但我不确定这会有多好。

有人能帮忙吗?

EDIT1:正在抛出的确切错误未能分配到X字节。我认为这是因为它以某种方式消耗了所有可用的内存(尽管我坐在8位内存上,而且绝对没有内存)。

EDIT2:

下面的代码似乎也有效。

代码语言:javascript
运行
复制
std::vector<cv::Mat*> ptrvec;
do{

 image.readimage();
 ptrvec.push_back(new cv::Mat((length, width, CV_8UC4, image)));
 freeimagememory(image);
}
while(hasimage);

这个内存没有问题(我可以将我想要的所有图像都按下),但是当我尝试这样做时,我会遇到访问冲突。

代码语言:javascript
运行
复制
cv::imshow("Test Window", *ptrvec[0]);

EDIT3:

我有可能达到32位的上限吗?我完全有能力将它重新编译成一个64位的项目。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-12 19:52:34

当您将3000幅彩色图像800 x 600存储在向量中时,可能会耗尽内存。将Mat指针存储在内存中不会解决您的问题,因为数据仍然在RAM中分配。

检查系统中是否有足够的内存来存储所有图像。如果没有,您可以批量上传图像,例如,处理前500幅图像,然后处理下500幅图像,等等。

在您的程序中,您在堆栈上分配向量。当您需要一个大内存块(您的情况)时,建议在堆上分配。因此,可以尝试在堆上分配向量(前提是您有足够的内存来存储该向量)。有关更多信息,请参见堆栈与堆本cpp教程

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18189934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档