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
- Visual Studio: errore "Imansible trovare il file Metadata XYZ" dopo la modifica continua
- MSDeploy salta le regole quando si usa MSBuild PublishProfile con Visual Studio 2012
- Intellisense e suggerimento di codice non funzionano in Visual Studio 2012 Ultimate RC
- VS2012 torna a una normale finestra di controllo TFS?
- Come posso cambiare la porta IIS Express per un sito
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:
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);