2014-11-24 18 views
8

Jak być może wiesz, wiele rzeczy zmieniło się w OpenCV 3 (w porównaniu do openCV2 lub starej pierwszej wersji).Szkolenie Opencv 3 SVM

W dawnych czasach, trenować jeden SVM użyłby:

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

W trzeciej wersji interfejsu API, nie ma CvSVMParams ani CvSVM. Zaskakująco, jest a documentation page about SVM, ale mówi wszystko, ale nie jak naprawdę go używać (przynajmniej nie mogę tego zrozumieć). Co więcej, wygląda na to, że nikt w Internecie nie używa SVM z OpenCV 3.0.

Obecnie tylko udało mi się uzyskać następujące:

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

Czy możesz podać mi informacje, w jaki sposób przepisać rzeczywiste szkolenia OpenCV 3?

Odpowiedz

26

z opencv3.0, to zdecydowanie inna, ale nie jest trudne:

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

Działa jak czar, dzięki za szybką reakcję! Czy możesz mi powiedzieć, jaki jest wynik reprezentowany w res cv :: Mat? Czy zawiera on te same wartości, które były na etykietach cv :: Mat? –

+0

res.at (0) będzie zawierał identyfikator. "coś" będzie tutaj zmiennoprzecinkowe lub int, w zależności od rodzaju etykiet. – berak

+0

Informacja ta: "Zapytanie o matę, // wejście, 1 kanał, 1 wiersz (zastosuj przekształcenie (1,1), jeśli nie jest to konieczne)" bardzo zmieniło sukces mojej implementacji . Dziękuję @berak – Koray

8

byłem przenoszenie mojego kodu z OpenCV 2.4.9 do 3.0.0-RC1 i miał ten sam problem. Niestety API ma zmian, ponieważ odpowiedź została wysłana, więc chciałbym, aby go zaktualizować odpowiednio:

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); 
Powiązane problemy