Я новичок в OpenCV и C ++.
Я пытаюсь написать код PCA для распознавания лиц, используя 3 разных лица. Для этого каждое изображение (размером 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: недостаточно памяти (не удалось выделить 144004 байта) в OutOfMemoryError
Мой размер изображения 180х200. Я не знаю что делать? Также, как я могу сформировать вектор строки в opencv, используя C ++? (Для вычисления ковариации мне нужно умножить разностный вектор на его значение).
Я не знаю OpenCV и его типов. Но твой typedef
выглядит подозрительно
Я предполагаю, что ошибка возникает при создании imgXv
случаи Row
, За каждый звонок Row imgXv(36000,img1);
создан вектор, состоящий из 36000 экземпляров Mat
которые все копии imgX
экземпляров. Посмотреть конструктор 2) из std::vector::vector
в cppreference.com:
vector( size_type count, const T& value, const Allocator& alloc = Allocator());
(2)2) Создает контейнер с количеством копий элементов со значением value.
Итак, вы пытаетесь сохранить 108003 изображения в памяти. Каждое из ваших изображений состоит из 36000 пикселей. Если каждый пиксель представлен по крайней мере 1 байтом, это займет минимум 3,6 ГБ памяти.
Исходя из того, что я понимаю из вашего подхода, вы не хотите этого, а скорее typedef vector<float> Row;
а также Row imgXv(36000);