我是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相乘)。
答案 0 :(得分:1)
我不知道OpenCV及其类型。但是你的typedef
看起来很可疑。
我的猜测是在创建imgXv
Row
个实例时发生错误。对于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)使用值为值的元素的计数副本构造容器。
所以你试图在内存中保留 108003张图片。每个图像由36000像素组成。如果每个像素至少由1个字节表示,则这将占用 3.6 GB 的最小内存。
从我的方法来看,你不希望这样,而是typedef vector<float> Row;
和Row imgXv(36000);