OpenCV non è in grado di configurare i parametri SVM

Ho appena iniziato il mio apprendimento su SVM usando C ++ OpenCV e mi riferivo alla documentazione SVM qui . Volevo provare il codice sorgente di esempio dal link per familiarizzare con esso, ma non ho potuto eseguire il codice sorgente di esempio. Restituisce l’errore:

Errore 1 errore C2065: “CvSVMParams”: identificatore non dichiarato

Sto usando Visual Studio 2012 con OpenCV 3.0.0. Il processo di installazione dovrebbe essere corretto poiché tutti gli altri codici funzionano bene tranne questo.

Molte cose sono cambiate da OpenCV 2.4 a OpenCV 3.0 . Tra gli altri, il modulo di apprendimento automatico, che non è retrocompatibile.

Questo è il codice di esercitazione OpenCV per SVM , aggiornamento per OpenCV 3.0:

 #include  #include  #include "opencv2/imgcodecs.hpp" #include  #include  using namespace cv; using namespace cv::ml; int main(int, char**) { // Data for visual representation int width = 512, height = 512; Mat image = Mat::zeros(height, width, CV_8UC3); // Set up training data int labels[4] = { 1, -1, -1, -1 }; Mat labelsMat(4, 1, CV_32SC1, labels); float trainingData[4][2] = { { 501, 10 }, { 255, 10 }, { 501, 255 }, { 10, 501 } }; Mat trainingDataMat(4, 2, CV_32FC1, trainingData); // Set up SVM's parameters Ptr svm = SVM::create(); svm->setType(SVM::C_SVC); svm->setKernel(SVM::LINEAR); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); // Train the SVM with given parameters Ptr td = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat); svm->train(td); // Or train the SVM with optimal parameters //svm->trainAuto(td); Vec3b green(0, 255, 0), blue(255, 0, 0); // Show the decision regions given by the SVM for (int i = 0; i < image.rows; ++i) for (int j = 0; j < image.cols; ++j) { Mat sampleMat = (Mat_(1, 2) << j, i); float response = svm->predict(sampleMat); if (response == 1) image.at(i, j) = green; else if (response == -1) image.at(i, j) = blue; } // Show the training data int thickness = -1; int lineType = 8; circle(image, Point(501, 10), 5, Scalar(0, 0, 0), thickness, lineType); circle(image, Point(255, 10), 5, Scalar(255, 255, 255), thickness, lineType); circle(image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType); circle(image, Point(10, 501), 5, Scalar(255, 255, 255), thickness, lineType); // Show support vectors thickness = 2; lineType = 8; Mat sv = svm->getSupportVectors(); for (int i = 0; i < sv.rows; ++i) { const float* v = sv.ptr(i); circle(image, Point((int)v[0], (int)v[1]), 6, Scalar(128, 128, 128), thickness, lineType); } imwrite("result.png", image); // save the image imshow("SVM Simple Example", image); // show it to the user waitKey(0); } 

L’output dovrebbe essere simile a:

inserisci la descrizione dell'immagine qui

Ho trovato che il codice sopra funzionava, ma avevo bisogno di fare una piccola modifica per convertire le etichette in numeri interi. La modifica è in grassetto:

 // Set up training data **Original**: int labels[4] = { 1, -1, -1, -1 }; Mat labelsMat(4, 1, **CV_32SC1**, labels); // Set up training data **Modified**: int labels[4] = { 1, -1, -1, -1 }; Mat labelsMat(4, 1, **CV_32S**, labels);