opencv3 SVM

    xiaoxiao2023-03-24  4

    #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); }结果:

    自己也不是很理解,以后再看

    转载请注明原文地址: https://ju.6miu.com/read-1201365.html
    最新回复(0)