ARS展览项目(四)——SVM分类器

这个表情识别项目的第二步

下面是代码,作用是把上面识别的n个txt,利用SVM分类器训练出一个数据集,这个数据集可以包含好几个标签。

本篇博客的实现方法参照了https://blog.csdn.net/zmdsjtu/article/details/53667929,这个很好用,感谢这位博主。

#include<opencv2\opencv.hpp> 
#include<string>
#include<fstream>    
using namespace std;
using namespace cv;
using namespace cv::ml;

void read_data(float data[200][136], int begin1, string categrious);
int main()
{

	float data_series[200][136];

	read_data(data_series, 0, "平静");
	read_data(data_series, 50, "高兴");
	read_data(data_series, 100, "厌恶");
	read_data(data_series, 150, "生气");
	int face_tags[200];
	for (int i = 0; i < 50; i++) {
		face_tags[i] = 170;
		face_tags[i + 50] = 250;
		face_tags[i + 100] = 300;
		face_tags[i + 150] = 350;
	}

	//训练需要用到的数据
	//	int 标签[4] = { 1, 2, 3, 4 };
	//	float 训练数据[4][2] = { { 31, 12 },{ 65, 220 },{ 440, 350 },{ 400, 400 } };
	//转为Mat以调用
	Mat training_Mat(200, 136, CV_32FC1, data_series);//这边数据类型要处理好,不然粗事儿
	Mat tags_label(200, 1, CV_32SC1, face_tags);
	//训练的初始化
	Ptr<SVM> svm = SVM::create();
	svm->setType(SVM::C_SVC);
	svm->setKernel(SVM::LINEAR);
	svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
	//开始训练
	svm->train(training_Mat, ROW_SAMPLE, tags_label);
	svm->save("SVM_DATA.xml");
}

void read_data(float data[200][136], int begin1, string categrious) {
	fstream read_file;
	//  read_file.imbue(std::locale("chs")); 


	for (int i = 0; i < 50; i++) {
		read_file.open(categrious + "\\" + to_string(i + 1) + ".txt");
		for (int j = 0; j < 136; j++) {
			string aaa;
			read_file >> aaa;
			//			cout << aaa;			
			data[i + begin1][j] = atof(aaa.c_str());
		}
		read_file.close();//关闭是个好习惯 
	}
}
posted @ 2024-09-24 10:34  AtanChen  阅读(32)  评论(0)    收藏  举报