这个表情识别项目的第二步
下面是代码,作用是把上面识别的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();//关闭是个好习惯
}
}
标签:SVM,tags,read,series,分类器,int,ARS,data
From: https://www.cnblogs.com/atanchen/p/18428490