现在我正试图在矢量中以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位项目。
答案 0 :(得分:1)
将3000张彩色图像800 x 600存储在矢量中时,可能内存不足。在内存中存储Mat指针不能解决您的问题,因为数据仍然在RAM中分配。
检查系统中是否有足够的内存来存储所有图像。如果没有,您可以批量上传图像,例如,处理前500张图像,然后处理下500张图像等。
在程序中,您在堆栈上分配矢量。当您需要大块内存(您的情况)时,建议在堆上分配。因此可以尝试在堆上分配向量(假设您有足够的内存来存储向量)。有关详细信息,请参阅stack vs heap或this cpp-tutorial。