opencv 手写选择题阅卷 (三)训练分类器
2024-09-22 03:29:58
opencv 手写选择题阅卷 (三)训练分类器
1,分类器选择:SVM
本来一开始用的KNN分类器,但这个分类器目前没有实现保存训练数据的功能,所以选择了SVN分类器;
2,样本图像的预处理和特征提取代码与识别代码中使用一样的代码.
3,训练时的输入数据主要为两个矩阵,一个矩阵保存所有样本的特征数据,每一行一个图像,另一个矩阵保存每个样本所属的类别,比如 1.0代表A,2.0代表B,0代表空白.
4,所有样本分别保存在5个文件夹中(一个是空白,四个字母ABCD),用批处理生成一个文本文件包括所有样本文件文件名和分类:
目前只使用了四个人书写的60个字母和几个空白样本,后期再增加更多人的更多样本,文本文件内容如下样式:
1 A\2016072316013018.png
1 A\2016072316013022.png
1 A\2016072316013026.png
2 B\2016072316010401.png
2 B\2016072316010405.png
2 B\2016072316010409.png
;//每个字符多个个图片 FILE * pf = fopen(listname,"r"); if (pf == NULL){ printf("没有发现样本列表文件;\n"); return; } ]; ){ , pf)) break; ) continue; n_img++; } HOGDescriptor *hog = , ), cvSize(, ), cvSize(, ), cvSize(, ), ); int nw = hog->getDescriptorSize(); CvMat * trainData = cvCreateMat(n_img, nw, CV_32FC1); CvMat * trainClasses = cvCreateMat(n_img, , CV_32FC1); //每个样本都要提取特征,写入到训练矩阵 ] = ""; strcpy(path, listname); int path_len = strlen(listname); ; i--){ if (path[i] == '\\'){ path[i+] = '\0'; break; } } fseek(pf, , SEEK_SET); ;//训练数据中的第N个 ){ , pf)) break; ) continue; char * str_lable = line; char * str_imgname = NULL; int line_len = strlen(line); ; i < line_len; i++) { if (line[i] == ' '){ line[i] == '\0'; str_imgname = line + i + ; break; } } if (str_imgname == NULL) continue; ] = ""; strcpy(img_name, path); strcat(img_name, str_imgname); img_name[strlen(img_name) - ] = '\0'; IplImage* src = cvLoadImage(img_name, ); if (src == NULL) { printf("打开样本图片出错:%s;\n", img_name); continue; } IplImage* train_img = cvCreateImage(cvSize(, ), , ); preproc_img(src, train_img); vector<float> descriptors;//存放结果 hog->compute(train_img, descriptors, Size(, ), Size(, )); //Hog特征计算 ; for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++) { cvmSet(trainData, nItem, n, *iter);//存储HOG特征 n++; } double val = strtod(str_lable, NULL); cvmSet(trainClasses, nItem, , val); cvReleaseImage(&src); cvReleaseImage(&train_img); nItem++; } if (nItem != n_img){ printf("实际样本数据与列表中样本数据不同;\n"); } fclose(pf); CvSVM svm;//新建一个SVM CvSVMParams param;//这里是SVM训练相关参数 CvTermCriteria criteria; criteria = cvTermCriteria(CV_TERMCRIT_EPS, , FLT_EPSILON); param = CvSVMParams(CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria); svm.train(trainData, trainClasses, NULL, NULL, param);//训练数据 //保存训练好的分类器 svm.save("HOG_SVM_DATA.xml"); cvReleaseMat(&trainData); cvReleaseMat(&trainClasses); }
最新文章
- 使用SwipeListView实现滑动效果
- spring中用到哪些设计模式
- maven 热部署成功案列
- liunx几台机器直接用ssh链接
- 502 Bad Gateway什么意思
- datagridview 点击列标题排序
- 【JavsScript】推荐五款流行的JavaScript模板引擎
- Maven SDK
- 更靠谱的js判断浏览器及其版本
- struts2(一) struts2入门
- hdu4553约会安排 线段树
- 7、正确的赚钱方式 - CEO之公司管理经验谈
- thinter中lable标签控件(二)
- [CTSC2018]暴力写挂
- jwt vs session 以rails 为例 (翻译部分)
- [译]ES6特性
- Assetbundle管理与加载
- 雷林鹏分享:C# 索引器(Indexer)
- 理解Storm Metrics
- 贝叶斯vs频率派:武功到底哪家强?| 说人话的统计学&#183;协和八(转)
热门文章
- Codeforces Round #277 (Div. 2) B. OR in Matrix 贪心
- delphi 插入 HTML代码 播放器
- [WebGL] Setting Up WebGL
- SiteMesh学习笔记
- MapReduce原理讲解
- C++重载(主要介绍使用友元函数重载)
- mysql中 case when的使用
- 小米2s使用Hexamob Recovery PRO恢复数据
- Python_sklearn机器学习库学习笔记(五)k-means(聚类)
- mysql数据库千万级别数据的查询优化和分页测试