OpenCV cv :: Mat使用std :: vector导致潜在的内存泄漏

时间:2013-08-12 14:41:09

标签: c++ arrays opencv matrix stdvector

现在我正试图在矢量中以cv :: Mats的形式保存整个图像列表,以便以后处理。现在我有一些看起来像这样的东西:

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 gig的内存上并且肯定没有内存)。

EDIT2:

以下代码似乎也有效。

std::vector<cv::Mat*> ptrvec;
do{

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

这个没有内存问题(我可以推送我想要的所有图像)但是当我尝试时会出现访问冲突

cv::imshow("Test Window", *ptrvec[0]);

EDIT3:

我有可能达到32位的上限吗?我有能力将其重新编译为64位项目。

1 个答案:

答案 0 :(得分:1)

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

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

在程序中,您在堆栈上分配矢量。当您需要大块内存(您的情况)时,建议在上分配。因此可以尝试在堆上分配向量(假设您有足够的内存来存储向量)。有关详细信息,请参阅stack vs heapthis cpp-tutorial