#include<opencv2\opencv.hpp>
#include<opencv\ml.h>
#include<iostream>
using namespace cv;
using namespace cv::ml;
void main() {
Mat img = Mat::zeros(Size(600, 600), CV_8UC3);
int lables[8] = { 1, -1, 1, 1, -1, 1, -1, 1 }; //注意数据类型
Mat lablesMat(8, 1, CV_32SC1, lables);
float trainingData[8][2] = { { 501, 150 },{ 255, 10 },{ 501, 255 },{ 10, 501 },{ 25, 80 },
{ 150, 300 },{ 77, 200 } ,{ 300, 300 }};
Mat trainingDataMat(8, 2, CV_32FC1, trainingData);
Ptr<SVM> model = SVM::create();
model->setType(SVM::C_SVC);
model->setKernel(SVM::LINEAR);
Ptr<TrainData> data = TrainData::create(trainingDataMat, ROW_SAMPLE, lablesMat); //训练数据
model->train(data);
Vec3b color1(0, 100, 250), color2(255, 255, 0);
Vec3b pointColor1(0, 255, 0), pointColor2(255, 0, 0);
for (int i = 0; i < img.rows; i++) {
Vec3b * ptrImg = img.ptr<Vec3b>(i);
for (int j = 0; j < img.cols; j++) {
Mat sample = (Mat_<float>(1, 2) << j,i);
float result = model->predict(sample); //预测分区域
if (result == 1.0) {
ptrImg[j] = color1;
}
else if(result == -1.0){
ptrImg[j] = color2;
}
}
}
for (int i = 0; i < lablesMat.rows; i++) { //绘点
float *ptrtrain = trainingDataMat.ptr<float>(i);
Point point = Point(ptrtrain[0], ptrtrain[1]);
if (lables[i] == 1) {
circle(img, point, 3, pointColor1, -1);
}
else {
circle(img, point, 3, pointColor2, -1);
}
}
int n = model->getVarCount(); //获得支持向量维数
Mat f = model->getSupportVectors(); //获得SVM支持向量
for (int i = 0; i < n; i++) {
uchar *v = f.ptr(i);
circle(img, Point((int)v[0], (int)v[1]), 5, Scalar(0, 0, 225), 2);
}
imshow("img", img);
waitKey(0);
}
结果:
多维处理:
#include<opencv2\opencv.hpp>
#include<iostream>
#include<opencv2\ml\ml.hpp>
using namespace cv;
using namespace cv::ml;
void main() {
Mat img(Size(500, 500), CV_8UC3);
int sNum = 100;
int num = 2 * sNum;
Mat labels(num, 1, CV_32SC1);
Mat trainData(num, 2, CV_32FC1);
RNG rng(200);
float c = 0.6;
int sample = (int)(sNum * c);
Mat trainClass = trainData.rowRange(0, sample);
Mat c1 = trainClass.colRange(0, 1);
rng.fill(c1, RNG::UNIFORM, Scalar(1), Scalar(0.4*img.cols));
c1 = trainClass.colRange(1, 2);
rng.fill(c1, RNG::UNIFORM, Scalar(1), Scalar(img.rows));
trainClass = trainData.rowRange(2 * sNum - sample, num);
c1 = trainData.colRange(0, 1);
rng.fill(c1, RNG::UNIFORM, Scalar(img.cols*0.6), Scalar(img.cols));
c1 = trainData.colRange(1, 2);
rng.fill(c1, RNG::UNIFORM, Scalar(1), Scalar(img.rows));
trainClass = trainData.rowRange(sample, num - sample);
c1 = trainClass.colRange(0, 1);
rng.fill(c1, RNG::UNIFORM, Scalar(0.4*img.cols), Scalar(0.6*img.cols));
c1 = trainData.colRange(1, 2);
rng.fill(c1, RNG::UNIFORM, Scalar(1), Scalar(img.rows));
labels.rowRange(0, sNum).setTo(1);
labels.rowRange(sNum, num).setTo(2);
Ptr<SVM> model = SVM::create();
model->setType(SVM::C_SVC);
model->setKernel(SVM::LINEAR);
Ptr<TrainData> data = TrainData::create(trainData, ROW_SAMPLE, labels);
model->train(data);
Vec3b color1(255, 255, 0), color2(0, 255, 255);
Vec3b color3(0, 120, 120), color4(120, 120, 0);
for (int i = 0; i < img.rows; i++) {
Vec3b *ptImg = img.ptr<Vec3b>(i);
for (int j = 0; j < img.cols; j++) {
Mat tra = (Mat_<float>(1, 2) << j, i);
float response = model->predict(tra);
if (response == 1) {
ptImg[j] = color1;
}
else if (response == 2) {
ptImg[j] = color2;
}
}
}
for (int i = 0; i < sNum; i++) {
float a1 = trainData.at<float>(i, 0);
float a2 = trainData.at<float>(i, 1);
circle(img, Point((int)a1, (int)a2), 3, Scalar(255, 0, 0), -1);
}
for (int i = sNum; i < num; i++) {
float a1 = trainData.at<float>(i, 0);
float a2 = trainData.at<float>(i, 1);
circle(img, Point((int)a1, (int)a2), 3, Scalar(255, 0, 255), -1);
}
int count = model->getVarCount();
Mat m = model->getSupportVectors();
for (int i = 0; i < count; i++) {
uchar *mm = m.ptr(i);
circle(img, Point(mm[0], mm[1]), 5, Scalar(255, 125, 125), 2);
}
imshow("img", img);
waitKey(0);
}
结果:
自己也不是很理解,以后再看