#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
using namespace cv::ml;
int main()
{
//训练需要用到的数据
int label[4] = { 1, 2, 3, 4 };
float train[4][2] = { { 31, 12 }, { 65, 220 }, { 440, 350 }, { 400, 400 } };
//转为Mat以调用
Mat TRAIN(4, 2, CV_32FC1, train);
Mat LABEL(4, 1, CV_32SC1, label);
//训练的初始化
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
//开始训练
svm->train(TRAIN, ROW_SAMPLE, LABEL);
//-----------无关紧要的美工的部分-----------------------
//----其实对每个像素点的坐标也进行了分类----------------
//int W = 512, H = 512;
//Mat img = Mat::zeros(H, W, CV_8UC3);
//Vec3b green(0, 255, 0), blue(255, 0, 0), red(0, 0, 255), black(0, 0, 0);
//for (int i = 0; i < img.rows; ++i)
//for (int j = 0; j < img.cols; ++j)
//{
// Mat sampleMat = (Mat_<float>(1, 2) << j, i);
// float response = svm->predict(sampleMat);
// if (response == 1)
// img.at<Vec3b>(i, j) = green;
// else if (response == 2)
// img.at<Vec3b>(i, j) = blue;
// else if (response == 3)
// img.at<Vec3b>(i, j) = red;
// else if (response == 4)
// img.at<Vec3b>(i, j) = black;
//}
////--------把初始化训练的点画进图片------------
//int thickness = -1;
//int lineType = 8;
//for (int i = 0; i < sizeof(label) / sizeof(int);i++) {
// circle(img, Point(train[i][0], train[i][1]), 10, Scalar(255, 255, 255), thickness, -1);
// cout << "sizeof(label):" << sizeof(label) << endl;
// cout << "sizeof(int):" << sizeof(int) << endl;
//}
//// 把 support vectors cout粗来看看……
//Mat sv = svm->getSupportVectors();
//cout << "Support Vectors为:" << endl;
//for (int i = 0; i < sv.rows; ++i)
//{
// const float* v = sv.ptr<float>(i);
// cout << v[0] << " " << v[1] << endl;
//}
//测试测试
Mat dst;
float testData[2][2] = { { 31, 11 }, { 61, 221 } };
Mat testMat(2, 2, CV_32FC1, testData);
svm->predict(testMat, dst);
cout << "分类结果为:" << endl;
cout << dst;
//imshow("SVM显示", img);
waitKey(-1);
}