opencv 手写选择题阅卷 (三)训练分类器
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);
}
opencv 手写选择题阅卷 (三)训练分类器的更多相关文章
- opencv 手写选择题阅卷 (二)字符识别
opencv 手写选择题阅卷 (二)字符识别 选择题基本上只需要识别ABCD和空五个内容,理论上应该识别率比较高的,识别代码参考了网上搜索的代码,因为参考的网址比较多,现在也弄不清是参考何处的代码了, ...
- opencv 手写选择题阅卷 (四)Android端 手机应用开发
opencv 手写选择题阅卷 (四)Android 手机应用开发 在PC端把代码调通以后开始开发Android 手机应用,因为主要功能代码为C++代码,所以需要通过NDK编译,JAVA通过JNI方式调 ...
- opencv 手写选择题阅卷 (一)表格设计与识别
(一)答题表格设计与识别 实际设计好的表格如下图 为了图像精确,表格和四角的标记都是由程序生成的,文字和数据是后期排版软件添加上去的. 图中四角的四个黑方块主要用来定位表格,然后就可以切割出每个单元格 ...
- TensorFlow 入门之手写识别CNN 三
TensorFlow 入门之手写识别CNN 三 MNIST 卷积神经网络 Fly 多层卷积网络 多层卷积网络的基本理论 构建一个多层卷积网络 权值初始化 卷积和池化 第一层卷积 第二层卷积 密集层连接 ...
- 利用opencv源代码和vs编程序训练分类器haartraining.cpp
如需转载请注明本博网址:http://blog.csdn.net/ding977921830/article/details/47733363. 一 训练框架 训练人脸检測分类器须要三个步骤: (1 ...
- OpenCV手写数字字符识别(基于k近邻算法)
摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...
- 利用keras进行手写数字识别模型训练,并输出训练准确度
from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.lo ...
- keras实现mnist手写数字数据集的训练
网络:两层卷积,两层全连接,一层softmax 代码: import numpy as np from keras.utils import to_categorical from keras imp ...
- MNIST手写数字数据库
手写数字库很容易建立,但是总会很浪费时间.Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun建有一个手写数字数据库,训练库有60,000张手写数字图像,测试库有 ...
随机推荐
- Java和C#在面向对象上语法的区别
做了几年了开发一直没有总结什么,回到了家乡的小城做了一名培训班的教员,教授软件开发的知识.细小的知识从头细细嚼来,别有一番滋味.或是以前遗漏的太多,或是确实没有系统的学习过,教学生的过程中自己也对教材 ...
- delphi 13 打印相关
打印 页面设置 打印预览 文档属性 //---------------------------------------------------------------------------- ...
- ADO.NET中使用事务进行数据库读写的办法
使用事务一般是进行数据写入,数据读取一般是不需要这货的 第一种办法: 使用存储过程: 顾名思义,在存储过程中定义好变量,定义好事务开始,结束,错误回滚然后在ADO.NET中正常调用存储过程的方法就行 ...
- if条件
-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L filen ...
- Redis 字符串(String)
Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 12 ...
- Asp.Net 之 WebService部署到服务器后出现" The test form is only available for requests from the local machine "
最近由于任务需要开发了一个WebService, 部署到服务器以后,出现上述问题,网上查找到如下解决方案: 问题原因: 从 NET Framework 1.1 起定义了一个名为 HttpPostLoc ...
- C笔记01:关于printf函数输出先后顺序的讲解
关于printf函数输出先后顺序的讲解!! 对于printf函数printf("%d%d\n", a, b);函数的实际输出顺序是这样的先计算出b,然后再计算a,接着输出a,最后再 ...
- Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值
package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...
- Emacs 配置 Python 编程环境
python编程环境设置涉及到:自动完成.语法检查.虚拟环境. 为了不把系统搞乱,在python的虚拟环境中安装相关的插件. 一.安装python虚拟环境 virtualenvwrapper sudo ...
- https的工作流程
(1)客户端向服务器提出请求,发出SSL握手信号. (2)服务器发出回应,并出示服务器证书(公钥),显示服务器站点身份. (3)客户端验证服务器证书,并生成一个随机的会话密钥,密钥长度达到128位. ...