2014-11-24 149 views
8

正如您所知,许多事情在OpenCV 3中发生了变化(与openCV2或旧的第一个版本比较)。Opencv 3支持向量机培训

在过去,训练SVM,应当使用:

CvSVMParams params; 
params.svm_type = CvSVM::C_SVC; 
params.kernel_type = CvSVM::POLY; 
params.gamma = 3; 

CvSVM svm; 
svm.train(training_mat, labels, Mat(), Mat(), params); 

在第三个版本的API,没有CvSVMParams也不CvSVM。令人惊讶的是,有a documentation page about SVM,但它告诉了所有事情,但不知道如何真正使用它(至少我无法做到)。 此外,互联网上没有人使用OpenCV 3.0的SVM。

目前,我只设法得到如下:

ml::SVM.Params params; 
params.svmType = ml::SVM::C_SVC; 
params.kernelType = ml::SVM::POLY; 
params.gamma = 3; 

能否请您为我提供的信息,如何改写实际培训OpenCV的3?

回答

26

与opencv3.0,这是绝对不同的,但并不难:

Ptr<ml::SVM> svm = ml::SVM::create(); 
// edit: the params struct got removed, 
// we use setter/getter now: 
svm->setType(ml::SVM::C_SVC); 
svm->setKernel(ml::SVM::POLY); 
svm->setGamma(3); 

Mat trainData; // one row per feature 
Mat labels;  
svm->train(trainData , ml::ROW_SAMPLE , labels); 
// ... 
Mat query; // input, 1channel, 1 row (apply reshape(1,1) if nessecary) 
Mat res; // output 
svm->predict(query, res); 
+0

工程就像一个魅力,感谢您的快速反应! 你能告诉我,res cv :: Mat代表的结果如何? 它是否包含相同的值,在标签cv :: Mat? – 2014-11-24 21:46:21

+0

res.at (0)将包含该id。 'something'在这里是float或int,取决于标签的类型 – berak 2014-11-24 21:49:11

+0

这个信息:“Mat query; // input,1channel,1 row(apply nesssecary重整(1,1))”改变了我的实现成功。谢谢@berak – Koray 2017-01-30 06:34:34

8

我在移植我的代码来自OpenCV的2.4.9至3.0.0-RC1和有同样的问题。不幸的是,API有变化,因为答案被张贴,所以我想相应地更新它:

Ptr<ml::SVM> svm = ml::SVM::create(); 
svm->setType(ml::SVM::C_SVC); 
svm->setKernel(ml::SVM::POLY); 
svm->setGamma(3); 

Mat trainData; // one row per feature 
Mat labels;  
Ptr<ml::TrainData> tData = ml::TrainData::create(trainData, ml::SampleTypes::ROW_SAMPLE, labels); 
svm->train(tData); 
// ... 
Mat query; // input, 1channel, 1 row (apply reshape(1,1) if nessecary) 
Mat res; // output 
svm->predict(query, res);