OpenCV no puede configurar los parámetros de SVM

Acabo de comenzar a aprender sobre SVM utilizando C ++ OpenCV y me refería a la documentación de SVM aquí . Quería probar el código fuente de muestra del enlace para familiarizarme con él primero, pero no pude ejecutar el código fuente de muestra. Devuelve el error:

Error 1 error C2065: ‘CvSVMParams’: identificador no declarado

Estoy usando Visual Studio 2012 con OpenCV 3.0.0. El proceso de instalación debe ser correcto ya que todos los otros códigos funcionan bien, excepto esto.

Muchas cosas cambiaron de OpenCV 2.4 a OpenCV 3.0 . Entre otros, el módulo de aprendizaje automático, que no es compatible con versiones anteriores.

Este es el código de tutorial de OpenCV para SVM , actualización para 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); } 

La salida debería verse así:

enter image description here

Descubrí que el código anterior funcionaba, pero necesitaba hacer una pequeña modificación para convertir las tags en enteros. La modificación está en negrita:

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