结果:
多维处理:
#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); }结果:自己也不是很理解,以后再看