我正在使用不支持更新的FisherFaces识别器在Qt和openCV中进行人脸识别,因此我必须保存人脸数据库以在任何更改后重新训练识别器。
这是我的保存代码:
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
和元素化 QDataStream 部分:MatVect-> QimgVect比QimgVect->MatVect并且它确实工作正常,但是在添加 QDataStream 之后:MatVect-> QimgVect->QDataStream和QDataStream->QimgVect->MatVect i得到上面显示的结果(垂直白线)。
编辑
从从 qdatastream 读取后RGB32到Indexed8给出以下结果: