Quantcast
Channel: OpenCV Q&A Forum - RSS feed
Viewing all articles
Browse latest Browse all 41027

SVM::getSupportVectors returns wrong answers

$
0
0
Hi! I'm running the demo program presented in [the OpenCV tutorial(introduction to SVM) website](http://docs.opencv.org/3.0.0/d1/d73/tutorial_introduction_to_svm.html) , but I get a different result from the result shown in the link. ![image description](/upfiles/14508034806989382.png) As you can see from the picture, the support vectors are not correctly plotted. Those three points(support vectors) that are closest to the separate line are not encircled by gray rings. I single stepped into the code and found that SVM::getSupportVectors() returned only one vector that is very cloes to (0, 0), which is highlighted by a gray ring in the upper left corner. Any idea about what is going wrong? I'm using OpenCV 3.0.0 with VS2015 in Win7. The code is as follows (I copied the code from the tutorial and pasted it into VS). #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}; float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} }; Mat trainingDataMat(4, 2, CV_32FC1, trainingData); Mat labelsMat(4, 1, CV_32SC1, labels); // Train the SVM Ptr svm = SVM::create(); svm->setType(SVM::C_SVC); svm->setKernel(SVM::LINEAR); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); svm->train(trainingDataMat, ROW_SAMPLE, labelsMat); // Show the decision regions given by the SVM Vec3b green(0,255,0), blue (255,0,0); 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); }

Viewing all articles
Browse latest Browse all 41027

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>