私は顔認識プロジェクトにcv :: PCAクラスを使用しています。私は顔の写真を1つの行ベクトルに変換し、それらを1つの大きな配列に連結し、pcaにフィードして、認識のために距離を使用しようとする新しい空間を取得します。問題は、私がプログラムを始めるたびにpcaをゼロから計算するのは本当に時間がかかることです(ほぼ5分)。計算されたpcaをハードドライブに保存し、プログラムを再起動するときにロードする必要があることを理解しました。そして、ここに問題があります。私が見てきたように、cv :: PCAの中のすべてのcv :: MatオブジェクトはCV_32F型です。私は通常の画像として保存しようとすると、その8ビット画像に変換され、いくつかのデータが失われています。私はXML/YAMLの永続性を使用すると、生成されたファイルは本当に大きく、データも失われます(私はそれを保存して、別の構造にロードし、差異の大きさを確認するためにcerr<<sum(pca_orginal.mean==pca_loaded.mean)[0]<<endl
を実行しました)。今私はstd::ofstream::binary
フラグとistream::read
とstd::ofstream::write
を使用しようとしていますが、いくつかのタイプの問題があります(out.write(_pca.mean.data,_pca.mean.rows*_pca.mean.cols*4/*CV_32F->4*CV_8U*/\);
error: no matching function for call to ‘std::basic_ofstream<char, std::char_traits<char> >::write(uchar*&, int)
を生成します。私もopenexrライブラリとそのファイル形式について聞いたことがあります。私は混乱のためにごめんなさい 私はcv::Mat operator==
説明、および考えを読み違え:。?「誰もが同じような問題がありましたCV_32F型CV :: Matをpreciousを失うことなくファイルに保存するには?
をOpenCVの2.3.1とOpenCVの2.2を使用して解決策を見つけた
編集 m個。それは反対の方法で動作するので、0を与えるsum(pca_orginal.mean==pca_loaded.mean)[0]
が悪い可能性があります最高ではない。つまり、XML/YMLは巨大なファイルの生成とは別に問題なく動作します。また、Cスタイルのキャストを使用した後、バイナリストリームを動作させることができましたが、生成されるファイルも大きくなりました(150MB以上)。
答えはThxですが、既に書いたように、xml関数は非常に大きなファイルを生成します(ピクセル値はテキストとして書き込まれるため)。保存されたファイルを使用すると精度が低下するようです。 – morynicz
私は参照してください。問題のあるコードを投稿してください。間違いなく 'data'配列をバイナリファイルにダンプして、何の問題もなく読み込むことが可能でなければなりません(異なるフロートを表すマシン間でファイルを動かしていない限り)。 – misha
混乱して申し訳ありませんが、xmlは精度を落としません。今のところ、(const char *)にCスタイルのキャストを使用した後、私は平均行列を書いたり読んだりすることができました。今のところ、hddに書き込んだ後、すべてのデータが妥当な(100MB未満の)サイズになっているかどうかを確認するだけです。 – morynicz