2016-12-18 1 views
0

Je travaille sur la reconnaissance faciale Projet et j'ai suivi le tutoriel sur le site opencv et j'ai utilisé le même ensemble de données, mais quand je teste mon programme j'ai un résultat étrange (la valeur de confiance) il me donne une grande valeur ((confiance = 621034879.) aussi il me donne une confiance négative lors du test d'un échantillon du même jeu. pourquoi la Confiance a une telle valeur et a une valeur négative ??? voici mon code:Reconnaissance faciale Valeur négative de confiance

#include "opencv2/core/core.hpp" 
#include "opencv2/contrib/contrib.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 
#include <fstream> 
#include <sstream> 
using namespace cv; 
using namespace std; 
static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') { 
std::ifstream file(filename.c_str(), ifstream::in); 
if (!file) { 
    string error_message = "No valid input file was given, please check the given filename."; 
    CV_Error(CV_StsBadArg, error_message); 
} 
string line, path, classlabel; 
while (getline(file, line)) { 
    stringstream liness(line); 
    getline(liness, path, separator); 
    getline(liness, classlabel); 
    if (!path.empty() && !classlabel.empty()) { 
     images.push_back(imread(path, 0)); 
     labels.push_back(atoi(classlabel.c_str())); 
    } 
} 
} 


int main(int argc, const char *argv[]) { 
// Check for valid command line arguments, print usage 
// if no arguments were given. 


// Get the path to your CSV. 
string fn_csv = "C:/Users/ASUS/Documents/Visual Studio 2013/Projects/Car_Detection/a.txt"; 
// These vectors hold the images and corresponding labels. 
vector<Mat> images; 
vector<int> labels; 
// Read in the data. This can fail if no valid 
// input filename is given. 
try { 
    read_csv(fn_csv, images, labels); 
} 
catch (cv::Exception& e) { 
    cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl; 
    // nothing more we can do 
    exit(1); 
} 
// Quit if there are not enough images for this demo. 
if (images.size() <= 1) { 
    string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!"; 
    CV_Error(CV_StsError, error_message); 
} 
// Get the height from the first image. We'll need this 
// later in code to reshape the images to their original 
// size: 
int height = images[0].rows; 

Mat testSample = images[images.size() - 1]; 
int testLabel = labels[labels.size() - 10]; 

images.pop_back(); 
labels.pop_back(); 

Ptr<FaceRecognizer> model = createEigenFaceRecognizer(); 
model->train(images, labels); 
// The following line predicts the label of a given 
// test image: 
int predictedLabel = model->predict(testSample); 

double confidence = 0.0; 
model->predict(testSample, predictedLabel, confidence); 
// 
string result_message = format("Label = %d/confidence = %d.", predictedLabel, confidence); 
cout << result_message << endl; 


return 0; 
} 

Répondre

0

celui-ci est simple. Vous êtes casting confidence (qui est un double) en tant que int en utilisant %d dans votre chaîne de format. Ce que vous voulez est d'utiliser %f (éventuellement avec un modificateur de limiter décimales.

string result_message = format("Label = %d/confidence = %.2f.", predictedLabel, confidence);