2014-11-24 148 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);