2014-11-24 2 views
8

Как вы знаете, многое изменилось в OpenCV 3 (в сравнении с openCV2 или старой первой версией).Opencv 3 Обучение SVM

В старые времена, обучать 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, но он рассказывает все, но не как его использовать (по крайней мере, я не могу разобраться). Кроме того, похоже, что никто в Интернете не использует SVM из 3.0 OpenCV.

В настоящее время я только успел получить следующее:

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? –

+0

res.at (0) будет содержать идентификатор. «something» будет float или int здесь, в зависимости от типа меток. – berak

+0

Эта информация: «Mat query; // input, 1channel, 1 row (apply reshape (1,1) if nessecary)» сильно изменило успех моей реализации , Спасибо @berak – Koray

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);