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