了解SVM:https://www.jianshu.com/p/61849d554001
1、获取样本,对自己的样本分类命名,可搜索批量命名方式进行批量命名。
注意样本分辨率保持一致
2、获取训练图像并贴上标签
样本示例:
代码讲解:
void get_0(Mat& trainingImages, vector& trainingLabels)
{
for (int i = 0; i < 408; i++)//数字0的样本数量为408
{
Mat SrcImage = imread("E:\\VSpro\\svm\\0\\" + to_string(i) + ".jpg", 0);//读样本
threshold(SrcImage, SrcImage, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);//二值化
SrcImage = SrcImage.reshape(0, 1);//将图片转成一行
trainingImages.push_back(SrcImage);//存入训练集
trainingLabels.push_back(0);//标签为数字0
}
}
3、配置SVM训练器参数训练并保存模型
OpenCV中的SVM参数优化:https://www.cnblogs.com/hust-yingjie/p/6582218.html
//配置SVM训练器参数
CvSVMParams params;
params.svm_type = SVM::C_SVC;
params.kernel_type = SVM::LINEAR;//RBF效果不好
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 10000, 1e-6);
//训练
CvSVM svm;
cout << "训练中..." << endl;
svm.train_auto(trainingData, classes, Mat(), Mat(), params);
//保存模型
svm.save("E:\\VSpro\\svm\\svm.xml");
4、验证识别效果
char onenumber(Mat img)//分辨率与样本一致,二值化图像
{
CvSVM svm;
svm.clear();
svm.load("E:\\VSpro\\svm\\svm.xml");
Mat p = img.reshape(0, 1);
p.convertTo(p, CV_32FC1);
char response = (int)svm.predict(p);
p.release();
return response;
}
两位数根据X坐标高低判断高低位