cvsvm的问题预测

时间:2015-08-28 19:45:58

标签: opencv svm libsvm

我正在尝试使用OpenCV cvsvm训练SVM分类器。我有 68 行和 2772 列,第一个 34 行对应于正样本,其余 34 行对应负面样本。这是我的代码。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main()
{
    bool is_recognizedcharacter = false;

    vector<float> values, values1, values2, values3, values4;

    FileStorage fs2("/home/shahnawaz/Desktop/opencv-svm/vecSupport.yml",  FileStorage::READ);
    FileStorage fs3("/home/shahnawaz/Desktop/opencv-svm/vecSupport1.yml", FileStorage::READ);
    FileStorage fs4("/home/shahnawaz/Desktop/opencv-svm/vecSupport2.yml", FileStorage::READ);
    FileStorage fs5("/home/shahnawaz/Desktop/opencv-svm/vecSupport3.yml", FileStorage::READ);
    //FileStorage fs6("/home/shahnawaz/Desktop/opencv-svm/vecSupport4.yml", FileStorage::READ);

    fs2["vector"]>>values;
    fs3["vector"]>>values1;
    fs4["vector"]>>values2;
    fs5["vector"]>>values3;
    //fs6["vector"]>>values4;

    //fill with data
    values.insert(values.end(), values1.begin(), values1.end());
    values.insert(values.end(), values2.begin(), values2.end());


    fs2.release();
    fs3.release();
    fs4.release();

    float arr[188496];
    float car[2772];
    float noncar[2772];

    // move positive and negative to arr
    std::copy(values.begin(), values.end(), arr);
    std::copy(values3.begin(), values3.end(), car);
    //std::copy(values4.begin(), values4.end(), noncar);

    // get a sample for testing
    for (unsigned int i = 0; i < 2772;i++)
    {
     noncar[i] = arr[182952+i];
    }


    float labels[68];
    for (unsigned int s = 0; s < 68; s++)
    {
     if (s<34)
     labels[s] = +1;
     else
     labels[s] = -1;
    }

    Mat labelsMat(68, 1, CV_32FC1, labels);
    Mat trainingDataMat(68,2772, CV_32FC1, arr);


    // Set up SVM's parameters
    CvSVMParams params;
    params.svm_type    = CvSVM::C_SVC;
    params.kernel_type = CvSVM::LINEAR;
    params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

    // Train the SVM
    CvSVM SVM;
    SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);

    Mat matinput(1,2772,CV_32FC1,noncar);
    cout<<matinput;

    is_recognizedcharacter= SVM.predict(matinput);
    cout<<is_recognizedcharacter<<endl;
}

您也可以从图像中看到结构。

enter image description here

问题 对于阴性和阳性测试样品,我得到预测值+1。有人可以帮我解决问题吗?非常感谢你。

P.S:对于matlab svm,它正确地预测了对象。

编辑:请从here

下载yml文件

0 个答案:

没有答案