SVM多分类器的实现(Opencv3,C++)

之前说要用SVM实现表情识别来着,所以找个简单例子练练手。


惯例开始放结果,实现结果如下:

//这里简单对四个点分了四类,图片显示得很直观。

//支持向量总共6个。

//最后测试了两个点进行分类。

SVM多分类器的实现(Opencv3,C++)_第1张图片


只需要配置好Opencv3的环境即可运行。

这里用到的是cv::SVM, 老版本Opencv2410之前用的是CvSvm,推荐用最新的Opencv310。


配置环境链接:
1.常规方法: http://blog.csdn.net/zmdsjtu/article/details/52235056
2.一键安装方法: http://blog.csdn.net/zmdsjtu/article/details/52794260

//代码的备注自我感觉写得挺多啦

下面就是简单粗暴的代码啦:

#include 

using namespace std;
using namespace cv;
using namespace cv::ml;

int main()
{


	//训练需要用到的数据
	int 标签[4] = { 1, 2, 3, 4 };
	float 训练数据[4][2] = { { 31, 12 },{ 65, 220 },{ 440, 350 },{ 400, 400 } };
	//转为Mat以调用
	Mat 训练Mat(4, 2, CV_32FC1, 训练数据);
	Mat 标签label(4, 1, CV_32SC1, 标签);
	//训练的初始化
	Ptr svm = SVM::create();
	svm->setType(SVM::C_SVC);
	svm->setKernel(SVM::LINEAR);
	svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
	//开始训练
	svm->train(训练Mat, ROW_SAMPLE, 标签label);

	//-----------无关紧要的美工的部分-----------------------	
	//----其实对每个像素点的坐标也进行了分类----------------
	int 宽 = 512, 高 = 512;
	Mat 演示图片 = Mat::zeros(高, 宽, CV_8UC3);
	Vec3b green(0, 255, 0), blue(255, 0, 0), red(0, 0, 255), black(0, 0, 0);
	for (int i = 0; i < 演示图片.rows; ++i)
		for (int j = 0; j < 演示图片.cols; ++j)
		{
			Mat sampleMat = (Mat_(1, 2) << j, i);
			float response = svm->predict(sampleMat);

			if (response == 1)
				演示图片.at(i, j) = green;
			else if (response == 2)
				演示图片.at(i, j) = blue;
			else if (response == 3)
				演示图片.at(i, j) = red;
			else if (response == 4)
				演示图片.at(i, j) = black;
		}
	//--------把初始化训练的点画进图片------------
	int thickness = -1;
	int lineType = 8;
	for (int 画点 = 0; 画点 < sizeof(标签) / sizeof(int); 画点++) {
		circle(演示图片, Point(训练数据[画点][0], 训练数据[画点][1]), 10, Scalar(255, 255, 255), thickness, -1);
	}
	// 把 support vectors  cout粗来看看……
	Mat sv = svm->getSupportVectors();
	cout << "Support Vectors为:" << endl;
	for (int i = 0; i < sv.rows; ++i)
	{
		const float* v = sv.ptr(i);
		cout << v[0] << " " << v[1] << endl;
	}

	//测试测试

	Mat 结果;
	float teatData[2][2] = { { 20, 11 },{ 310, 411 } };
	Mat query(2, 2, CV_32FC1, teatData);

	svm->predict(query, 结果);
	cout << "分类结果为:" << endl;
	cout << 结果;
	imshow("SVM显示", 演示图片);
	waitKey(-1);

}

祝大家使用分类器愉快咯,有问题欢迎留言交流哈~

SVM多分类器的实现(Opencv3,C++)_第2张图片


你可能感兴趣的:(opencv,机器学习,-----语言相关-----,人脸识别)