diff --git a/SVMTest.cpp b/SVMTest.cpp new file mode 100644 index 0000000..7a49108 --- /dev/null +++ b/SVMTest.cpp @@ -0,0 +1,70 @@ +#include +#include +#include + +using namespace cv; + +int main() +{ + // Data for visual representation + int width = 512, height = 512; + Mat image = Mat::zeros(height, width, CV_8UC3); + + // Set up training data + float labels[4] = {1.0, -1.0, -1.0, -1.0}; + Mat labelsMat(4, 1, CV_32FC1, 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 + CvSVMParams params; + params.svm_type = CvSVM::C_SVC; + params.kernel_type = CvSVM::LINEAR; + params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); + + // Train the SVM + CvSVM SVM; + SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params); + + 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; + for (int i = 0; i < trainingDataMat.rows; i++) { + const CvScalar color = (labels[i] == 1) ? + CV_RGB(255, 255, 255) : CV_RGB(0, 0, 0); + circle(image, Point(trainingData[i][0], trainingData[i][1]), 5, + color, thickness, lineType); + } + + // Show support vectors + thickness = 2; + lineType = 8; + int c = SVM.get_support_vector_count(); + + for (int i = 0; i < c; ++i) + { + const float* v = SVM.get_support_vector(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); + +}