前景提要
HDC调试需求开发(15万预算),能者速来!>>> 请教各位大侠: 我用opencv(3.0版)的SVM进行分类时,svm->(traindata, ROW_SAMPLE, labels)函数进行分类时,traindata的数据格式必须是CV_32FC1,且labels的数据格式为CV_32SC1,换成其他数据格式,则运行错误,这是为什么?此外,数据格式按照上面的要求定义后,为什么使用response=svm->predict(testMat)进行分类时,response的值往往不是预期的类型,而是绝对值很大的整数或负数,如1.07794e+009,跪求解答。全部代码如下所示: #include <string.h> #include<string> #include<iostream> #include<opencv2/ml.hpp> #include <opencv2/core/core.hpp> using namespace std; using namespace cv; using namespace cv::ml; int main(){ // step 1: //训练数据的分类标记,即4类 float labels[16] = { 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0 }; Mat labelsMat = Mat(16, 1, CV_32SC1, labels); //训练数据矩阵 float trainingData[16][2] = { { 0, 0 }, { 4, 1 }, { 4, 5 }, { -1, 6 }, { 3, 11 }, { -2, 10 }, { 4, 30 }, { 0, 25 }, { 10, 13 }, { 15, 12 }, { 25, 40 }, { 11, 35 }, { 8, 1 }, { 9, 6 }, { 15, 5 }, { 20, -1 } }; Mat trainingDataMat = Mat(16, 2, CV_32FC1, trainingData); //------------设置支持向量机的参数--------------------- // opencv3.0 Ptr<ml::SVM> svm = ml::SVM::create(); svm->setType(SVM::C_SVC); svm->setKernel(SVM::RBF); svm->setC(100); svm->setGamma(1); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, (int)1e7, 1e-6));//终止准则函数:当迭代次数达到最大值时终止 // -----训练------- printf("\n-----------------starting to train data by SVM----------------\n" ; svm->train(trainingDataMat, ROW_SAMPLE, labelsMat); // step 4: //使用训练所得模型对新样本进行分类测试 for (int i = -5; i<15; i++) { for (int j = -5; j<15; j++) { float a[] = { i, j }; Mat sampleMat = Mat(1, 2, CV_32FC1, a); cout << "sampleMat = " << sampleMat << endl; float response = svm->predict(sampleMat); cout << response << " "; } cout << endl; } return 0; }