zoukankan      html  css  js  c++  java
  • c++版本的opencv3.4.1里分类器输出值异常

    问题:在用opencv分类时,predict输出的结果总是会出现类似这样的情况:分类结果实为15,结果输出1097859072或者1.097859072+e9

    以opencv3.4.1 svm分类器为例,环境为vs2010,只列框架,不写细节。

    训练部分:

        Ptr<SVM> svm = SVM::create();
        svm->setType(SVM::Types::C_SVC);
        svm->setKernel(SVM::KernelTypes::RBF);
        svm->setC(0.1);

        trainingData=Mat::zeros(dataNum,featureNum,CV_32F);
        labelMat=Mat::zeros(dataNum,1,CV_32SC1);//省略训练数据和标签数据赋值
        Ptr<TrainData> svmData = TrainData::create(trainingData, SampleTypes::ROW_SAMPLE, labelMat);
        //训练分类器  
        ParamGrid c_grid(0.0001, 1000, 10);//若·不设置使用默认值范围
        svm->trainAuto(svmData);

        string s="SVM_"+to_string(_Longlong(flag))+".xml";//此句随意,不同环境不同;
        svm->save(s);

    测试部分(当predict的输入只有测试数据时)

    Mat testMat=Mat::zeros(1,num,CV_32F);//省略测试数据赋值
    int result;
    Ptr<ml::SVM> classifier;
    classifier=ml::SVM::load("SVM_1.xml");
    result=classifier->predict(testMat);//predict返回值为float,这里result结果为1097859072;

    (float )result的结果为1.097859072+e9;//这里要想获得15的结果。直接将result的int看做float,不做强制转换;

    解决方式 *(float*)(&result)可将1097859072转换为15;

    测试部分(2)

    Ptr<SVM> classifier;
    Mat resultMat=Mat::zeros(size,1,CV_32SC1);
     Mat testMat=Mat::zeros(size,num,CV_32F);
    classifier=SVM::load("SVM_1.xml");

    for(int i=0;i<size;i++){
    resultMat.at<int>(i,0)=classifier->predict(testMat);
    resultMat.at<float>(i,0);//输出设置为float

    测试部分(3)

    Mat testData=Mat::zeros(data,num,CV_32F);
     Mat testout=Mat::zeros(data,1,CV_32SC1);

    Ptr<ml::SVM> classifier;
     classifier=ml::SVM::load("SVM.xml");

    classifier->predict(testData,testout);
    std::ofstream file("d:resultTest_mutiple.txt");
     for(int i=0;i<data;i++)
        {

            file<<int(testout.at<float>(i,0))<<"    ";
            
            file<<std::endl;
        }

    file.close();
        

  • 相关阅读:
    Ubuntu 11.10 安装JDK
    virtualbox下安装ubuntu
    GridView控件的DataKeyNames
    Asp.net中防止用户多次登录的方法
    在asp.net中使用线程
    SQL2008更改表结构问题
    Ubuntu安装run文件
    ContextSwitchDeadlock
    CheckedListBox用法
    C#图片加水印图片和文字
  • 原文地址:https://www.cnblogs.com/trouble-easy/p/11739541.html
Copyright © 2011-2022 走看看