内存不足

Insufficient memory opencv

本文关键字:内存不足      更新时间:2023-10-16

我是OpenCV和c++的初学者。我正试图使用3个不同的面孔为人脸识别编写PCA代码。为此,每个图像(大小为d=mxn)被重塑为包含d个元素的列向量。

typedef vector<Mat> Row;
Row img1v(36000,img1);
Row img2v(36000,img2);
Row img3v(36000,img3);

我计算图像的均值向量如下:

Row meanImg;
 for(int i=0;i<img1v.size();++i)
{
  meanImg.push_back((img1v[i]+img2v[i]+img3v[i])/3);
}
cout<<meanImg.size()<<endl;

这里我得到了一个错误:

OpenCV错误:OutOfMemoryError (Failed to allocate 144004 bytes)

我的图像大小是180x200。我不知道该怎么办?也我怎么能形成一个行向量在opencv使用c++ ?(为了计算协方差,我需要将差向量与其转置相乘)

我不知道OpenCV及其类型。但是你的typedef看起来很可疑。

我的猜测是错误发生在创建RowimgXv实例时。对于Row imgXv(36000,img1);的每次调用,创建一个由36000个Mat实例组成的向量,这些实例都是imgX实例的副本。参见cppreference.com中std::vector::vector的构造器2):

vector( size_type count, const T& value, const Allocator& alloc = Allocator()); (2)

2)构造带有value元素的count个副本的容器

所以你试图保持108003图像在内存中。你的每张图像由36000像素组成。如果每个像素至少用1个字节表示,这将至少占用3.6 GB内存。

从你的方法中我得到的你不想要的,而是一个typedef vector<float> Row;Row imgXv(36000);