【问题标题】:Face recognition Opencv confidence negative value人脸识别Opencv置信度负值
【发布时间】:2017-05-03 19:53:52
【问题描述】:

我正在从事人脸识别项目,我已经按照 opencv 网站上的教程进行操作,并且我使用了相同的数据集,但是当我测试我的程序时,我得到了奇怪的结果(置信度值),它给了我很大的价值((confidence = 621034879.) 在测试来自同一数据集的样本时,它也给了我负面的信心。 为什么Confidence有这么大的值,而且是负值??? 这是我的代码:

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

【问题讨论】:

    标签: c++ opencv face-recognition


    【解决方案1】:

    这个很简单。您通过在格式字符串中使用%dconfidence(即double)转换为int。您想要的是使用%f(可能带有修饰符来限制小数位。

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

    【讨论】:

      猜你喜欢
      • 2012-07-04
      • 2015-07-05
      • 2016-09-18
      • 2018-09-15
      • 2019-08-10
      • 2011-02-20
      • 2017-02-26
      • 2017-02-03
      • 1970-01-01
      相关资源
      最近更新 更多