2012-04-18 93 views
1

我很努力解決這個問題很長一段時間了,也許這裏的某個人可能會提出一個錯誤的建議。我試圖用libfacerec從這個網站實現OpenCV的特徵臉:https://github.com/bytefish/libfacerec我使用的OpenCV-2.3.1與Visual Studio 2010OpenCV:使用CSV文件的特徵臉

的示例代碼使用本站的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 

我已經添加了一段代碼,下面應該加載圖像數據。這也正是在從libfacerec網站在/ 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. 
} 

整個項目構建罰款沒有任何錯誤,但是當我嘗試運行崩潰發生。我進入調試模式,並認爲這兩個矢量<馬特>圖像矢量< int>標籤(不介意沒有它們的空間導致它不會顯示在這裏)仍然是0這意味着沒有數據是加載。然而,當我打印變量的高度和寬度時,它顯示兩個(從orl_faces所有圖像都是140x140像素)

所以我的問題,出了什麼問題?爲什麼不是在填充高度和寬度時都填充矢量?

編輯:看來,這兩個向量在我的其他電腦正確填寫(矢量圖像[400],矢量標籤[400]然而程序仍然崩潰和運行調試時,我發現這個錯誤:

0000005:在0x77c415de在將Test.exe

未處理的異常。訪問衝突寫入位置00000000

它位於mat.hpp文件,通過這個文件步進時,向量v顯示這些錯誤: 【規格】CXX0030 :錯誤:無法評估表達式 [容量CXX0030:錯誤:無法評估表達式

+0

當你說矢量爲零時,你的意思是它們的長度爲零嗎? read_csv函數還返回一個錯誤代碼? – TomP89 2012-04-18 08:00:28

+0

我編輯了我的帖子,看起來我的另一臺電腦上的矢量被正確填充,但此時該程序仍然崩潰 – pimmes111 2012-04-18 08:32:54

回答

1

我很確定問題是這樣的。

你鏈接庫:

opencv_core231.lib 
opencv_highgui231.lib 
opencv_imgproc231.lib 

然後你與調試配置在Visual Studio中建立。看到問題了嗎?如果你想這樣做,切換到opencv_core231d.lib庫。但是:由於一些神祕的原因,OpenCV2.3.1的超級包沒有附帶tbb_debug.dll,所以Debug構建將會失敗。如果您使用的是超級包並希望使用libfacerec,然後在Visual Studio中激活發佈構建配置,則可以運行&運行,並且所有內容都可以正常工作。

我已經寫了一個教程,它應該很容易遵循:http://www.bytefish.de/blog/opencv_visual_studio_and_libfacerec。滾動到最底部以查看Windows中的Eigenfaces。所以你看,它確實有效。

+0

現在就像是一種魅力:)非常感謝。看起來這是Debug和Release版本之間的一個簡單的錯誤,但是很明顯,我自己很難用OpenCV作爲初學者。 – pimmes111 2012-04-19 08:08:25

+0

沒問題。這是一個棘手的問題。我不知道爲什麼它沒有失敗,當我在第一封郵件後嘗試它時。也許我已經意外地選擇了發佈版本。 :) – bytefish 2012-04-19 15:07:44