opencv3 SVM

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值