内存不足opencv

时间:2015-06-09 06:47:25

标签: c++ opencv pca face-recognition

我是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中的内存不足(无法分配144004个字节)

我的图片尺寸为180x200。我不知道该怎么办?另外我如何使用C ++在opencv中形成行向量? (为了计算协方差,我需要将差矢量与它的traspose相乘)。

1 个答案:

答案 0 :(得分:1)

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

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

  

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

     

2)使用值为值的元素的计数副本构造容器。

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

从我的方法来看,你不希望这样,而是typedef vector<float> Row;Row imgXv(36000);