1

就目前而言,我正在尝试以 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 gigs 内存上并且肯定有可用内存)。

编辑2:

下面的代码似乎也有效。

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]);

编辑3:

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

4

1 回答 1

1

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

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

在您的程序中,您在堆栈上分配向量。当您需要大块内存(您的情况)时,建议在堆上分配。所以可以尝试在堆上分配向量(前提是你有足够的内存来存储向量)。有关更多信息,请参阅stack vs heap此 cpp 教程

于 2013-08-12T19:52:34.867 回答