0

更新をサポートしていない 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 を使用した保存と読み込みが問題になりまし た。これらの行の原因は何ですか? 編集: 私はこれを試しました: QDataStream部分を公開し、要素 化しました: QimgVect->MatVectよりもMatVect->QimgVectを作成し、正常に動作しましたが、QDataStreamを追加した後: MatVect->QimgVect->QDataStreamおよびQDataStream->QimgVect->MatVect i上記の結果を取得します (縦の白い線)。 から画像を変換する編集
保存した ロードされた



QimgVect

qdatastream から読み取った後にRGB32からIndexed8にすると、次の結果が得られます。
ここに画像の説明を入力

4

2 に答える 2

0

SOここに解決策があります:グレースケールQimageQDataStream 変換して保存してからFormat_ARGB32保存する場合、読み込みのために変換して戻すFormat_Indexed8:コードを保存する

QFile file("students_dataset.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
//converting to ARGB32
foreach (QImage img, qimgvect) {
    img = img.convertToFormat(QImage::Format_ARGB32);
 }
// saving to QDataStream
out << qimgvect ;
file.flush();
file.close();

積載用

QFile file("students_dataset.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QVector<QImage> qimgvect;
// loading images vector from QDatastream
in >> qimgvect;
// converting to grayscale
QVector<QRgb> grayscale;
for (int i = 0; i < 256; ++i) grayscale.append(qRgb(i, i, i));
for (int i, i < qimgvect.size(),i++) {  
    QImage img = qimgvect.at(i).convertToFormat(QImage::Format_Indexed8,grayscale);        
    qimgvect.push_back(img);
}

file.close();

デフォルトQImageフォーマットFormat_ARGB32

于 2014-09-30T10:12:08.920 に答える