私はかなり長い間この問題に苦しんでいます、そして多分ここの誰かが何が悪いのかについての提案を持っているかもしれません。このサイトからOpenCVにEigenfacesを実装するためにlibfacerecを使用しようとしています:https ://github.com/bytefish/libfacerec VisualStudio2010でOpenCV-2.3.1を使用しています
サンプルコードは、次のサイトのorl_facesデータセットを使用します:http ://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.htmlそしてcsvファイルを使用してこれらの画像をロードします。このファイルには、400枚すべての画像(40人の異なる10枚の画像)へのすべてのパスがリストされ、各人物にラベルが付けられています。両方のエントリは「;」で区切られます。このcsvファイルの数行を以下に追加しました。
C:/Users/PIMMES/Documents/libraries/orl_faces/s1/1.pgm;0
C:/Users/PIMMES/Documents/libraries/orl_faces/s1/2.pgm;0
...
C:/Users/PIMMES/Documents/libraries/orl_faces/s2/1.pgm;1
C:/Users/PIMMES/Documents/libraries/orl_faces/s2/2.pgm;1
...
etc
画像データをロードするコードを以下に追加しました。これは、libfacerecWebサイトの/srcフォルダーにあるmain.cppファイルにリストされているコードとまったく同じです。
void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';')
{
std::ifstream file(filename.c_str(), ifstream::in);
if (!file) throw std::exception();
string line, path, classlabel;
while (getline(file, line))
{
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
images.push_back(imread(path, 0));
labels.push_back(atoi(classlabel.c_str()));
}
}
int main(int argc, const char *argv[])
{
// check for command line arguments
if(argc != 2)
{
cout << "usage: " << argv[0] << " <csv.ext>" << endl;
exit(1);
}
// path to your CSV
string fn_csv = string(argv[1]);
// images and corresponding labels
vector<Mat> images;
vector<int> labels;
// read in the data
try
{
read_csv(fn_csv, images, labels);
}
catch (exception& e)
{
cerr << "Error opening file \"" << fn_csv << "\"." << endl;
exit(1);
}
// get width and height
int width = images[0].cols;
int height = images[0].rows;
// get test instances
Mat testSample = images[images.size() - 1];
int testLabel = labels[labels.size() - 1];
...
etc.
}
プロジェクト全体はエラーなしで正常にビルドされますが、実行しようとするとクラッシュが発生します。デバッグモードに入って、vector <Mat>画像とvector<int>ラベルの両方(スペースがないとここでは正しく表示されないので気にしないでください)はまだ0であり、データがロードされていないことを意味します。ただし、変数の高さと幅を印刷すると、両方で140が表示されます(orl_facesのすべての画像は140x140ピクセルです)
だから私の質問、何が悪いのですか?高さと幅が入力されているのに、両方のベクトルが入力されないのはなぜですか?
編集:両方のベクターが他のPCで正しく入力されているようです(ベクター画像[400]、ベクターラベル[400]。ただし、プログラムはまだクラッシュし、デバッグを実行すると次のエラーが発生します:
Test.exeの0x77c415deで未処理の例外:0xC0000005:アクセス違反の書き込み場所0x00000000。
これはmat.hppファイルにあり、このファイルをステップスルーすると、ベクトルvに次のエラーが表示されます。[サイズ] CXX0030:エラー:式を評価できません[容量CXX0030:エラー:式を評価できません