Я работаю над распознаванием лиц в Qt и openCV, используя распознаватель FisherFaces, который не поддерживает обновление, поэтому мне нужно сохранить базу данных лиц, чтобы переобучить распознаватель после любых изменений.
Вот мой код для сохранения:
save(const std::vector* MatVect){ QFile file("students_dataset.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); QVector qimgvect; for (size_t i = 0; i < MatVect->size(); ++i) { cv::Mat matt = MatVect->at(i); QImage img((uchar*)matt.data, matt.cols, matt.rows, matt.step, QImage::Format_Indexed8); qimgvect.push_back(img); } out << qimgvect ; file.flush(); file.close(); }
< /пред>и это для загрузки:
проблема в том, что то, что я прочитал из файла, не то, что я сохранилload(std::vector* MatVect) { QFile file("students_dataset.dat"); file.open(QIODevice::ReadOnly); QDataStream in(&file); QVector qimgvect; in >> qimgvect; for (size_t i = 0; i < qimgvect.size(); ++i) { QImage img = qimgvect.at(i); cv::Mat matt = cv::Mat(70, 70, CV_8U, img.bits(), img.bytesPerLine()); MatVect->push_back(matt); } file.close(); return; }
так что именно не так в этом коде (надеюсь, не все)?
есть ли лучший/более простой способ сохранить вектор?
РЕДАКТИРОВАТЬ:
благодаря Marek_R часть преобразования исправлена, но теперь проблема с сохранением и загрузкой с помощью QDataStream. :
так что вызывает эти строки?
РЕДАКТИРОВАТЬ:
Я пробовал это:
сделалQimgVect
общедоступным и elemenated Часть QDataStream: MatVect-> QimgVect, чем QimgVect->MatVect, и она работала нормально, но после добавления QDataStream: MatVect-> QimgVect->QDataStream > и QDataStream->QimgVect->MatVect я получаю результат, показанный выше (вертикальные белые линии).
EDIT
преобразование изображения из < strong>RGB32 в Indexed8 после чтения из qdatastream дает следующий результат:
img.width(), img.height()
раньше, но получил тот же результат, поэтому я использовал 70x70, потому что все изображения имеют размер 70x70 в результате некоторой обработки. - person Chebhou   schedule 27.09.2014