troubleasy

导航

 

问题:在用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();
    

 

posted on 2019-11-15 16:57  troubleasy  阅读(216)  评论(0编辑  收藏  举报