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 手写选择题阅卷 (三)训练分类器的更多相关文章

  1. opencv 手写选择题阅卷 (二)字符识别

    opencv 手写选择题阅卷 (二)字符识别 选择题基本上只需要识别ABCD和空五个内容,理论上应该识别率比较高的,识别代码参考了网上搜索的代码,因为参考的网址比较多,现在也弄不清是参考何处的代码了, ...

  2. opencv 手写选择题阅卷 (四)Android端 手机应用开发

    opencv 手写选择题阅卷 (四)Android 手机应用开发 在PC端把代码调通以后开始开发Android 手机应用,因为主要功能代码为C++代码,所以需要通过NDK编译,JAVA通过JNI方式调 ...

  3. opencv 手写选择题阅卷 (一)表格设计与识别

    (一)答题表格设计与识别 实际设计好的表格如下图 为了图像精确,表格和四角的标记都是由程序生成的,文字和数据是后期排版软件添加上去的. 图中四角的四个黑方块主要用来定位表格,然后就可以切割出每个单元格 ...

  4. TensorFlow 入门之手写识别CNN 三

    TensorFlow 入门之手写识别CNN 三 MNIST 卷积神经网络 Fly 多层卷积网络 多层卷积网络的基本理论 构建一个多层卷积网络 权值初始化 卷积和池化 第一层卷积 第二层卷积 密集层连接 ...

  5. 利用opencv源代码和vs编程序训练分类器haartraining.cpp

    如需转载请注明本博网址:http://blog.csdn.net/ding977921830/article/details/47733363. 一  训练框架 训练人脸检測分类器须要三个步骤: (1 ...

  6. OpenCV手写数字字符识别(基于k近邻算法)

    摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...

  7. 利用keras进行手写数字识别模型训练,并输出训练准确度

    from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.lo ...

  8. keras实现mnist手写数字数据集的训练

    网络:两层卷积,两层全连接,一层softmax 代码: import numpy as np from keras.utils import to_categorical from keras imp ...

  9. MNIST手写数字数据库

    手写数字库很容易建立,但是总会很浪费时间.Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun建有一个手写数字数据库,训练库有60,000张手写数字图像,测试库有 ...

随机推荐

  1. Java和C#在面向对象上语法的区别

    做了几年了开发一直没有总结什么,回到了家乡的小城做了一名培训班的教员,教授软件开发的知识.细小的知识从头细细嚼来,别有一番滋味.或是以前遗漏的太多,或是确实没有系统的学习过,教学生的过程中自己也对教材 ...

  2. delphi 13 打印相关

    打印 页面设置 打印预览 文档属性     //---------------------------------------------------------------------------- ...

  3. ADO.NET中使用事务进行数据库读写的办法

    使用事务一般是进行数据写入,数据读取一般是不需要这货的 第一种办法: 使用存储过程: 顾名思义,在存储过程中定义好变量,定义好事务开始,结束,错误回滚然后在ADO.NET中正常调用存储过程的方法就行 ...

  4. if条件

    -e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L filen ...

  5. Redis 字符串(String)

      Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 12 ...

  6. Asp.Net 之 WebService部署到服务器后出现" The test form is only available for requests from the local machine "

    最近由于任务需要开发了一个WebService, 部署到服务器以后,出现上述问题,网上查找到如下解决方案: 问题原因: 从 NET Framework 1.1 起定义了一个名为 HttpPostLoc ...

  7. C笔记01:关于printf函数输出先后顺序的讲解

    关于printf函数输出先后顺序的讲解!! 对于printf函数printf("%d%d\n", a, b);函数的实际输出顺序是这样的先计算出b,然后再计算a,接着输出a,最后再 ...

  8. Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值

    package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...

  9. Emacs 配置 Python 编程环境

    python编程环境设置涉及到:自动完成.语法检查.虚拟环境. 为了不把系统搞乱,在python的虚拟环境中安装相关的插件. 一.安装python虚拟环境 virtualenvwrapper sudo ...

  10. https的工作流程

    (1)客户端向服务器提出请求,发出SSL握手信号. (2)服务器发出回应,并出示服务器证书(公钥),显示服务器站点身份. (3)客户端验证服务器证书,并生成一个随机的会话密钥,密钥长度达到128位. ...