1

私はかなり長い間この問題に苦しんでいます、そして多分ここの誰かが何が悪いのかについての提案を持っているかもしれません。このサイトから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:エラー:式を評価できません

4

1 に答える 1

1

問題はこれだと確信しています。

ライブラリに対してリンクしています:

opencv_core231.lib
opencv_highgui231.lib
opencv_imgproc231.lib

次に、VisualStudioのデバッグ構成を使用してビルドします。問題がわかりますか?これを実行したい場合は、opencv_core231d.libライブラリに切り替えてください。ただし、いくつかの不思議な理由でOpenCV2.3.1スーパーパックが付属していないtbb_debug.dllため、デバッグビルドは失敗します。スーパーパックを使用していてlibfacerecを使用する場合は、Visual Studioでリリースビルド構成をアクティブ化し、ビルドして実行すると、すべてが正常に機能します。

チュートリアルを作成しました。チュートリアルは簡単に理解できるはずです:http ://www.bytefish.de/blog/opencv_visual_studio_and_libfacerec 。一番下までスクロールして、Windowsの固有顔を確認します。ご覧のとおり、実際に機能します。

于 2012-04-18T22:27:37.570 に答える