2012-06-09 1 views
2

J'utilise OpenCV v2.4.1Erreur OpenCV "pas d'image est fausse" dans la méthode Fisherfaces.train()

Et c'est le code que je utilise

#include "opencv2/opencv.hpp" 
#include <iostream> 
#include <fstream> 
#include <sstream> 

using namespace cv; 
using namespace std; 

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); 
    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("at.txt"); 
    // 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; 
} 

contenu à fichier d'entrée txt:

./at/s10/2.pgm;9 ./at/s10/7.pgm;9 ./at/s10/6.pgm;9 ./at/s10 /9.pgm;9 ./at/s10/5.pgm;9

Maintenant, le problème est, tant que j'utilise ce fichier pgm, ça fonctionne très bien. Mais quand je spécifie un fichier jpg au lieu de pgm je reçois l'erreur suivante

Erreur OpenCV: Le pas de l'image est faux (La matrice n'est pas continue, ainsi son nombre des rangées ne peut pas être changé) dans la fonction inconnue, classent. .... \ src \ opencv \ modul es \ core \ src \ matrix.cpp, ligne 801

Jusqu'à présent, Im capable de tracer cette erreur provient de Fisherfaces.train() -> cv :: Mat Mais je ne sais rien, quelle pourrait être la raison. S'il vous plaît aider.

+0

Cette solution a fonctionné pour moi. http://stackoverflow.com/questions/2623163/opencv-2-0-c-api-using-imshow-returns-unhandled-exception-and-bad-flag Plus tôt, j'avais libéré et lib de débogage ajouté dans les propriétés du projet. Maintenant j'ai enlevé toutes les libs libérées et cela fonctionne parfaitement :-) – Sandeep

+0

Puisque vous avez trouvé la solution, vous pouvez l'afficher comme réponse et l'accepter :) – F21

Répondre

2

This solution travaillé pour moi!

Auparavant, j'avais libéré et lib de débogage ajouté dans les propriétés du projet. Maintenant j'ai enlevé toutes les libérations libérées et cela fonctionne parfaitement.

Questions connexes