线性SVM
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include "opencv2/imgcodecs.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/ml.hpp>
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
//! [setup1]
int labels[5] = {1, 1, -1, -1,-1};
float trainingData[5][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501},{10,10} }; //建立训练数据,必须是线性可分的。
//! [setup1]
//! [setup2]
Mat trainingDataMat(5, 2, CV_32FC1, trainingData); //32位float型
Mat labelsMat(5, 1, CV_32SC1, labels); //32位int型
//! [setup2]
// Train the SVM
//! [init]
Ptr<SVM> svm = SVM::create(); //采用智能指针调研SVM
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR); //线性可分因此采用线性核
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); 终止准则函数:当迭代次数达到最大值时终止
//! [init]
//! [train]
svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);
//! [train]
// Show the decision regions given by the SVM
//! [show]
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_<float>(1,2) << j,i);
float response = svm->predict(sampleMat);//predict是用来预测的,参数为:样本、返回值类型(如果值为ture而且是一个2类问题则返回判决函数值,否则返回类标签)
if (response == 1)
image.at<Vec3b>(i,j) = green;
else if (response == -1)
image.at<Vec3b>(i,j) = blue;
}
//! [show]
// Show the training data
//! [show_data]
int thickness = -1;
int lineType = 8; //线形
circle( image, Point(501, 10), 5, Scalar( 0, 0, 0), thickness, lineType