【问题标题】:Insufficient memory opencv内存不足opencv
【发布时间】:2015-08-23 20:15:44
【问题描述】:

我是 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)。

【问题讨论】:

  • 你试过调试你的代码吗?错误发生在哪个位置? img1的类型是什么?
  • 我没有得到 meanImg 大小.....输出终端显示此错误。 img1 是 cv::Mat

标签: c++ opencv pca face-recognition


【解决方案1】:

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

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

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

2) 使用具有值 value 的元素的 count 个副本构造容器。

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

根据我从您的方法中得到的信息,您不希望这样,而是 typedef vector&lt;float&gt; Row;Row imgXv(36000);

【讨论】:

  • 我不知道如何理解您的谢谢。答案是否解决了您的问题?有什么不清楚的吗?作为@KeenLearner 并且大概是 SO 的初学者,您可能对这个 FAQ link 和这个 meta discussion 感兴趣。
  • 我没有使用 typedef vector Row,而是使用了大小为 36000x1 的矩阵。
  • ...它是一个类型的向量,具体取决于Mat 使用的类型。但是如何处理不是这个问题的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
相关资源
最近更新 更多