2016-12-18 2 views
0

Я работаю над распознаванием лиц Проект, и я следил за учебником на opencv-сайте, и я использую один и тот же набор данных, но когда я тестирую свою программу, у меня есть странный результат (значение достоверности) это дает мне большое значение ((доверие = 621034879.), и это дает мне отрицательную уверенность при тестировании образца из того же набора данных. Почему Уверенность имеет такое большое значение и имеет отрицательное значение? вот мой код:Распознавание лиц Оверкус отрицательное значение

#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; 
} 

ответ

0

Это один очень просто. Вы бросаете confidence (который является double) как int с помощью %d в строке формата. Чего вы хотите использовать %f (возможно с модификатором ограничить знаков после запятой.

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

Смежные вопросы