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

选择题基本上只需要识别ABCD和空五个内容,理论上应该识别率比较高的,识别代码参考了网上搜索的代码,因为参考的网址比较多,现在也弄不清是参考何处的代码了,在这里就不一一感谢了.

基本步骤:

一,识别函数接受一般64X64的灰度图像;

二,二值化并反色为黑底白字;

三,找出字符的最小包围矩形,并大小归一化为32X32;

四,计算图像的HOG特征;

五,用SVM分类器对HOG特征进行识别,从而确定当前图像属于ABCD还是空白;

整个识别代码还是比较简单的.这得得益于opencv 对分类器的封装,除了图像预处理代码,实际识别代码只有几行;

部分代码

CvSVM svm;
;

int svm_init(char * data_filename)
{
    svm.load(data_filename);//"HOG_SVM_DATA.xml"
    svm_inited = ;
    ;
}

//
int svm_recognition(IplImage* image)
{
    ){
        ;
    }
    //预处理
    IplImage* test_img = cvCreateImage(cvSize(, ), , );
    preproc_img(image, test_img);//处理为黑底白字,并大小归一化

#ifdef _WIN32
    cvShowImage("Image", test_img);
    cvWaitKey();
#endif

    //特征提取
    HOGDescriptor *hog = , ), cvSize(, ), cvSize(, ), cvSize(, ), );
    vector<float> descriptors;//存放结果
    hog->compute(test_img, descriptors, Size(, ), Size(, )); //Hog特征计算
    cvReleaseImage(&test_img);//释放不需要的图像,释放内存

    //生成要检测的特征数据矩阵
    CvMat * mat_samples = cvCreateMat(, descriptors.size(), CV_32FC1);
    ;
    for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
    {
        cvmSet(mat_samples, , n, *iter);
        n++;
    }

    //识别
    int ret = svm.predict(mat_samples);//检测结果

    cvReleaseMat(&mat_samples);
    return ret;
}

opencv 手写选择题阅卷 (二)字符识别的更多相关文章

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

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

  2. opencv 手写选择题阅卷 (三)训练分类器

    opencv 手写选择题阅卷 (三)训练分类器 1,分类器选择:SVM 本来一开始用的KNN分类器,但这个分类器目前没有实现保存训练数据的功能,所以选择了SVN分类器; 2,样本图像的预处理和特征提取 ...

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

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

  4. tensorflow笔记(五)之MNIST手写识别系列二

    tensorflow笔记(五)之MNIST手写识别系列二 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7455233.html ...

  5. 利用神经网络算法的C#手写数字识别(二)

    利用神经网络算法的C#手写数字识别(二)   本篇主要内容: 让项目编译通过,并能打开图片进行识别.   1. 从上一篇<利用神经网络算法的C#手写数字识别>中的源码地址下载源码与资源, ...

  6. 手写AVL平衡二叉搜索树

    手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...

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

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

  8. 一个老程序员是如何手写Spring MVC的

    人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...

  9. 看看一个老程序员如何手写SpringMVC!

    人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...

随机推荐

  1. 云服务器 ECS Linux 误删除文件恢复方法介绍

    云服务器 ECS Linux 下,rm -rf  意味着一旦删除的文件是无法挽回的.但如果在没有文件覆盖操作的前提下,可以先尝试相关方式进行文件恢复. 本文对此进行简要说明. https://help ...

  2. WPF 之 WPF应用程序事件

    当新建一个wpf应用程序,会自动生成一个App.xaml和MainWindow.xaml文件. 其中 App.xam 用来设置Application,应用程序的起始文件和资源及应用程序的一些属性和事件 ...

  3. TF-IDF算法扫盲2

    TF-IDF算法是一种简单快捷的文档特征词抽取方法,通过统计文档中的词频来对文档进行主题分类.TF-IDF(term frequency–inverse document frequency)是一种统 ...

  4. iOS - UI - UIPageControl

    1.UIPageControl 分页控件 //分页控件初始化 UIPageControl * pageControl = [[UIPageControl alloc] init]; //分页页数 pa ...

  5. oracle PL/SQL(procedure language/SQL)程序设计(在PL/SQL中使用SQL)

    在PL/SQL程序中,允许使用的SQL语句只有DML和事务控制语句,使用DDL语句是非法的.使用SELECT语句从数据库中选取数据时,只能返回一行数据.使用COMMIT,  ROLLBACK, 和SA ...

  6. Java跳出循环-break和continue语句

    在实际编程中,有时需要在条件语句匹配的时候跳出循环.在Java里,由break和continue语句控制. “break”语句 “break”语句用来结束循环,即不再执行后边的所有循环. 示例:计算1 ...

  7. Speex回声消除代码分析

    先说明下,这里的代码流程是修改过的Speex流程,但与Speex代码差异不大,应该不影响阅读.   (1)用RemoveDCoffset函数进行去直流 (2)远端信号预加重后放入x[i+frame_s ...

  8. HttpServletResponse接口

    public interface HttpServletResponse extends ServletResponse 描述一个返回到客户端的HTTP回应.这个接口允许Servlet程序员利用HTT ...

  9. python实现发送邮件功能

    '''套接字是为特定的网络协议(例如TCP/IP,ICMP/IP,UDP/IP等),允许程序和接受并进行连接,要在python 中建立具有TCP和流套接字的简单服务器,需要使用socket模块,利用该 ...

  10. Laravel-Administrator enum使用数字key

    参考连接:Enum filter with numeric values 修改Fields\Enum::build()方法 $options['options'][] = array( 'id' =& ...