2012-07-23 15 views
5

ho questo problema,Aprire Cv fisherfaces

quando ho eseguito con VS2010 (debug) (cv aperto 2.4.0) facerec_demo.cpp mi gaves il programma di questo errore

Questo errore mi deriva a questa linea in facerec.cpp
(Fisherfaces :: treno (InputArray src, InputArray _lbls)

Mat data = asRowMatrix(src, CV_64FC1); <-- this gets a exeption, not handled. 

ed una banca dati che uso a IMG PGM e questo è il mio originale * facerec_demo.cpp file *

#include "stdafx.h" 
#include <opencv2/opencv.hpp> 


#include <iostream> 
#include <fstream> 

#include <vector> 
#include <string> 
#include <sstream> 

using namespace cv; 
using namespace std; 


vector<string> split_at_commas(const string& row) 
{ 
    vector<string> res; 
    istringstream buf(row); 
    string s; 
    while (getline(buf, s, ';')) 
    res.push_back(s); 
    return res; 
} 

Mat toGrayscale(InputArray _src) { 
    Mat src = _src.getMat(); 
    // only allow one channel 
    if(src.channels() != 1) 
     CV_Error(CV_StsBadArg, "Only Matrices with one channel are supported"); 
    // create and return normalized image 
    Mat dst; 
    cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1); 
    return dst; 
} 

void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') { 
    //std::ifstream file(filename.c_str(), ifstream::in); 
    std::ifstream file(_T("D:\\Users\\PC ACER\\Documents\\mycsv4.csv")); 
    if (!file) 
     throw std::exception(); 
    string line="", path="", classlabel=""; 
    while (getline(file, line)) { 
     //vector<string> values = split_at_commas(line); 
     stringstream liness(line); 
     getline(liness, path, ';'); 
     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&) { 
     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]; 
    // ... and delete last element 
    images.pop_back(); 
    labels.pop_back(); 
    // build the Fisherfaces model 
    Ptr<FaceRecognizer> model = createFisherFaceRecognizer(); 
    model->train(images, labels); 
    // test model 
    int predicted = model->predict(testSample); 
    cout << "predicted class = " << predicted << endl; 
    cout << "actual class = " << testLabel << endl; 
    // get the eigenvectors 
    Mat W = model->eigenvectors(); 
    // show first 10 fisherfaces 
    for (int i = 0; i < min(10, W.cols); i++) { 
     // get eigenvector #i 
     Mat ev = W.col(i).clone(); 
    // reshape to original size AND normalize between [0...255] 
    Mat grayscale = toGrayscale(ev.reshape(1, height)); 
     // show image (with Jet colormap) 
    Mat cgrayscale; 
     applyColorMap(grayscale, cgrayscale, COLORMAP_JET); 
     imshow(format("%d", i), cgrayscale); 
    } 
    waitKey(0); 
    return 0; 
} 
+0

Ora ottengo questo errore, in File -> facerec.cpp Metodo Fisherfaces :: prevedere Linea 414 dice Mat q = subspaceProject (_eigenvectors, _mean, src.reshape (1,1)); Quando carico il mio testample _eigenvectors e _mean dissapear !!! – rliberal

risposta

2

Vedo che si sta utilizzando OpenCV 2.4.0. Come lo sviluppatore ammetto che la confusione è colpa mia: non ho controllato a fondo i dati di input passati al metodo di allenamento, quindi le persone che passavano dati allineati in modo sbagliato hanno ricevuto messaggi di errore come il tuo. Molto probabilmente l'errore che vedi si verifica, perché le tue immagini di allenamento non hanno le stesse dimensioni. Questo è necessario per l'algoritmo Eigenfaces e Fisherfaces (non per gli istogrammi di pattern binari locali). OpenCV 2.4.0 prova semplicemente a rimodellare i dati su una matrice e fa esplodere il messaggio di errore che vedi; OpenCV 2.4.2 controlla invece (prima dell'allenamento) se i dati di input sono allineati correttamente e genera un'eccezione significativa ... con un messaggio molto chiaro.

Questo post assume potrebbe anche essere dovuto a collegare le librerie OpenCV:

Se non è che collega le librerie che potrebbe essere a causa delle dimensioni dell'immagine. Ridimensionare le immagini di formazione, può facilmente essere fatto con OpenCV cv::resize:

Ma probabilmente dovrebbe prendere in considerazione di passare a OpenCV 2.4.2, in cui tutto questo si aggiunge:

Questa versione viene anche con un esteso do documen tazione relativa a:

Tuttavia, se non è possibile modificare a OpenCV 2.4.2 e avrete bisogno di stare con OpenCV 2.4.0, allora si potrebbe anche usare libfacerec:

Questo è il progetto, che ha ottenuto fuse in OpenCV. Ho fatto in modo che funzioni con OpenCV 2.4.0 e ti lascerà esattamente la stessa interfaccia della versione OpenCV 2.4.2. Quindi, una volta che hai voglia di aggiornare a OpenCV 2.4.2, cambierai solo gli include.

+0

Grazie !!!! Funziona ora !!! – rliberal

+0

Ottimo per sentire! Qual era esattamente il problema? Probabilmente potresti aggiornare il tuo post o aggiungere la soluzione come commento qui. Aiuterà le persone che affrontano lo stesso problema. – bytefish

0

Ho risposto a questa domanda su un altro post ma voglio essere certo che le persone che cercano aiuto con questo errore troveranno sicuramente la risposta.

quando si effettua il modello

Ptr<FaceRecognizer> model = createFisherFaceRecognizer(); 

è necessario passare due params

createFisherFaceRecognizer(int num_components=0, double threshold=DBL_MAX); 

This page has more information on how createFisherFaceRecognizer works

1

ho ottenuto lo stesso errore OpenCV, provo tutto l'aiuto che trovo qui, e mi dà comunque un'eccezione (eccezione verificatasi nell'istruzione .Predict()).

Il problema era nella dimensione delle immagini. Le dimensioni di un'immagine devono essere inferiori a 100 px (< 100 px) (non sono sicuro se esattamente meno di 100, forse 100 funzionerebbero ancora).

Ho cambiato le dimensioni delle immagini da 150: 150 a 80:80 e funziona!

Spero di aiutare qualcuno, perché questo è stato un fastidioso errore.