2012-07-23 9 views
5

tengo este problema,abierto Cv Fisherfaces

cuando funciono con VS2010 (depuración) (cv abierta 2.4.0) facerec_demo.cpp me gaves el programa de este error

me deriva Este error a esta línea en facerec.cpp
(Fisherfaces :: tren (InputArray src, InputArray _lbls)

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

y una base de datos que uso en img pgm y este es mi * facerec_demo.cpp archivo original *

#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

Ahora me sale este error, en Archivo -> facerec.cpp Método Fisherfaces :: predecir Línea 414 dice Mat q = subspaceProject (_eigenvectors, _mean, src.reshape (1,1)); Cuando cargo mi ejemplo de prueba _eigenvectors y _mean desaparecen !!! – rliberal

Respuesta

2

veo que está usando OpenCV 2.4.0. Como desarrollador, reconozco que la confusión es mi culpa: no revisé minuciosamente los datos de entrada que pasaron al método de capacitación en ese momento, por lo que las personas que pasaron datos mal alineados recibieron mensajes de error como el suyo. Lo más probable es que el error que veas ocurra porque tus imágenes de entrenamiento no tienen el mismo tamaño. Esto es necesario para el algoritmo Eigenfaces y Fisherfaces (no para los Histogramas de patrones binarios locales). OpenCV 2.4.0 solo intenta remodelar los datos en una matriz y explota con el mensaje de error que ves; OpenCV 2.4.2 en su lugar verifica (antes del entrenamiento) si los datos de entrada están alineados correctamente y arroja una excepción significativa ... con un mensaje muy claro.

Este post asume también podría ser debido a la vinculación de las librerías OpenCV:

Si no se une las bibliotecas de las que podría ser debido al tamaño de la imagen. Cambiar el tamaño de imágenes de entrenamiento, se puede hacer fácilmente con OpenCV cv::resize:

Pero probablemente debería considerar la posibilidad de cambiar a OpenCV 2.4.2, donde se agrega todo esto:

Esta versión también viene con una amplia do cumentation en:

Sin embargo, si no se puede cambiar a OpenCV 2.4.2 y se le tenga que quedarse con OpenCV 2.4.0, entonces se podría también utilizar libfacerec:

Este es el proyecto, que quedó fusionado en OpenCV. Me aseguré de que funcionara con OpenCV 2.4.0 y te deja exactamente la misma interfaz que la versión OpenCV 2.4.2. Entonces, una vez que tenga ganas de actualizar a OpenCV 2.4.2, solo cambiará los includes.

+0

¡Gracias! ¡Funciona ahora! – rliberal

+0

¡Genial para escuchar! ¿Cuál fue exactamente el problema? Probablemente pueda actualizar su publicación o agregar la solución como comentario aquí. Ayudará a las personas que enfrentan el mismo problema. – bytefish

0

Respondí esta pregunta en otra publicación, pero quiero asegurarme de que las personas que buscan ayuda con este error encuentren la respuesta.

cuando usted hace el modelo

Ptr<FaceRecognizer> model = createFisherFaceRecognizer(); 

lo necesario para pasar dos parametros

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

This page has more information on how createFisherFaceRecognizer works

1

Tengo el mismo error OPENCV, trato de toda la ayuda que encuentro aquí, y todavía me da una excepción (excepción sucedida en la declaración .Predict()).

El problema estaba en el tamaño de las imágenes. El tamaño de una imagen debe ser inferior a 100px (< 100px) (no estoy seguro si exactamente menos de 100, tal vez 100 todavía funcionaría).

Cambio el tamaño de mis imágenes de 150: 150 a 80:80 y funciona!

Espero que ayude a alguien, porque esto fue un error molesto.

Cuestiones relacionadas