基于OPENCV的OCR身份证号识别技术

前言:
  本篇博客主要介绍OCR数字识别,代码基于C++,会有详细的实现流程以及源码,还会提到部分OPENCV 2和4的一些区别。(本篇文章仅为初学者的一些心得笔记,会有较多不完善和错误的地方,欢迎大家指出!PS:最后的杂谈务必看看)

一、身份证号码识别流程图

二、灰度图获取
  读取图片之后,对图片进行处理,获得图片的灰度图。方法有二:
 
  1)使用imread读取图片的时候,第二个参数可以直接设置为0,即直接读取一张灰度图
  2)使用cvtColor函数,设置参数将彩色图转换为灰度图。(具体方法请百度)但若是前面imread读入的图片就已是灰度图,就不能使用cvtColor函数再进行转换,因为该函数不能转换单通道图片,会报错。
 
  获取了灰度图之后,对图片进行大小调整,调整为(450,600),方便后续获取身份证号码区域。

三、找到身份证号码区域
  获得图片之后,对图片进行二值化,然后进行闭运算。(定义结构元素后,可用morphologyEx函数进行闭运算)再用findContours函数检测外轮廓,找到每个轮廓的最小界矩形区域。由于身份证号码区域长宽比为一个常数(约为18),设置一定的误差值之后,便可找到符合这一长宽比的矩形,就是身份证号码区域。(图中画出黑框)

四、裁剪身份证区域
  前一步找到身份证的区域,并且可以通过RotatedRect类(该类表示平面上的旋转矩形,有质心、边长、旋转角度三个属性)存储矩形区域。使用getRectSubPix函数从图片中裁剪出指定的矩形区域,然后再用resize函数调整图片的尺寸,变为(20,300),便于后面的数字切割。
 

 
 
五、号码切割
  对号码图片进行二值化后(若之前已进行二值化则不需要再进行),将每一个号码单独切割开来,进行识别。
 

  切割的原理:先创建一个等同于图片列数的flag向量。遍历每一列,对于每一列中,再遍历每一行。若该列中存在一行有黑色像素点,则将该列对应的flag标注为true,否则为false,标注为true的列表示属于数字的一部分。
  然后遍历flag向量,找到标注为true,并且后两个标注为false的那一列,可以认为是到了数字的边缘。同时在遇到true时,应该设置一个变量,记录数字的宽度为多少列,目的是通过找到后边缘与列数,算出前边缘的x坐标,便于后续切割。
  举个例子:如下图,flag为T的表示该列有像素,count统计有像素的列数,由于我们能得到count=14处的x坐标,x-14就为count=0处的坐标,之后便可以使用Rect函数进行切割。并保存在图片数组中。
 

 
 
六、提取号码特征
  号码的特征为梯度分布特征、灰度分布特征、水平/垂直方向直方图,每个字符最后都能得到一个1*72的特征向量。计算机主要就是依靠号码的特征,与已经训练好的神经网络进行匹配,以此达到对数字进行辨别。

七、找到训练样本及提取样本特征
  使用与上一步相同的函数对样本进行特征提取,包括0~9和X,每个数字有50个样本。提取后将其存到trainData中,将trainData和样本的类的标识classes存储到文件ann_xml.xml中,之后便可以直接调用而不需要再次运行该函数。
 
 
八、神经网络训练
  读入ann_xml.xml文件。创建一个3层的神经网络,输入层结点数设置为72,隐藏层结点数为24,输出层结点数为10。(因最后一位为矫正位,并且最后一位识别难度较大,因此只识别前17位,最后一位可通过公式计算出)设置训练方法、激活函数、迭代次数和误差最小值等,使用ann->train对神经网络进行训练。并将训练好的神经网络保存为文件,之后便可直接调用已经训练好的网络,大大节省程序运行的时间。
 
 
九、比对分类
  使用训练好的神经网络对数字进行分类,输入的数字为第五步切割得到的数字图片。使用ann->predict对输入的图片进行预测,找出与输入图片的特征最相似的结果,就是结果。(识别结果如下)


 
 
十、杂谈
(1)对于初学OPENCV的朋友,首先应该注意的是OPENCV的版本问题,网上很多资源使用的是OPENCV2,而现在来说大多人使用的是OPENCV4,2和4在神经网络的训练部分有较大的出入,因此在看代码的时候,应该明确自己的OPENCV的版本。(本篇博客中的代码均为OPENCV4版本)
  举个例子:

Mat layerSizes(1,3,CV_32SC1);     //3层神经网络layerSizes.at<int>( 0 ) = trainData.cols;   //输入层的神经元结点数,设置为72layerSizes.at<int>( 1 ) = nlayers; //1个隐藏层的神经元结点数,设置为24layerSizes.at<int>( 2 ) = numCharacters; //输出层的神经元结点数为:10ann.create(layerSizes , CvANN_MLP::SIGMOID_SYM ,1,1);  //初始化ann  SIGMOID_SYM即Sigmoid函数CvANN_MLP_TrainParams param;param.term_crit=cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,5000,0.01);

上面的代码段为OPENCV2环境下的初始化等步骤

 Mat layerSizes(1, 3, CV_32SC1);     //3层神经网络layerSizes.at<int>(0) = trainData.cols;   //输入层的神经元结点数,设置为72layerSizes.at<int>(1) = nlayers; //1个隐藏层的神经元结点数,设置为24layerSizes.at<int>(2) = numCharacters; //输出层的神经元结点数为:10ann->setLayerSizes(layerSizes);ann->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1);//后两个参数: 权梯度项的强度(一般设置为0.1) 动量项的强度(一般设置为0.1)ann->setActivationFunction(ANN_MLP::SIGMOID_SYM);ann->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 5000, 0.01));//后两项参数为迭代次数和误差最小值

而这部分实现同样功能的代码,使用的方法可以看到是有较大的区别。当环境配置为OPOENCV4而使用2的函数,自然也就会报错。
 
(2)本篇文章的源代码会分享给大家,希望大家在观看代码的时候,能够指出错误与不足,大家一起讨论与进步。代码链接在下方:

https://download.csdn.net/download/qq_42884797/12931807
 
(3)最后祝大家0error,0warning!

基于OPENCV的OCR身份证号识别技术相关推荐

  1. OpenCv NDK 银行卡/身份证号识别(3) 银行卡/身份证图像处理和卡号区域剪切

    通过前两篇我们已经对Opencv有所了解了,接下来就要真正的来处理我们的图像,然后把卡号给提取出来.首先我们先简单分析以下银行卡然后把处理流程列出来: 由上图我们很容易知道既然我们要找到卡号,银行卡的 ...

  2. php 人像识别,基于OpenCV的PHP图像人脸识别技术

    本文所介绍的技术不是原创,而是从一个叫Robert Eisele的德国人那里学习来的.他写了一个PHP扩展openCV,只封装了两个函数,叫face_detect和face_count. openCV ...

  3. php配置辨别图片形式,基于OpenCV的PHP图像人脸辨别技术(转载)

    当前位置:我的异常网» 图形/图像 » 基于OpenCV的PHP图像人脸辨别技术(转载) 基于OpenCV的PHP图像人脸辨别技术(转载) www.myexceptions.net  网友分享于:20 ...

  4. 1tensorflow 实现端到端的OCR:二代身份证号识别 + 2tensorflow LSTM+CTC实现端到端的不定长数字串识别

    1tensorflow 实现端到端的OCR:二代身份证号识别 链接地址:https://www.jianshu.com/p/803642d0d8f8 2tensorflow LSTM+CTC实现端到端 ...

  5. 基于opencv的人脸检测与识别(python)(1)

    基于opencv的人脸检测与识别(python语言)(1) 人脸检测和识别技术就目前而言,已经相对成熟,各类算法层出不穷,这都归功于各位奋斗在一线的大佬的努力(站在巨人的肩膀上的感觉就是爽).本文是参 ...

  6. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  7. 蚂蚁金服张洁:基于深度学习的支付宝人脸识别技术解秘-1

    蚂蚁金服张洁:基于深度学习的支付宝人脸识别技术解秘(1) 2015-08-13 10:22 于雪 51CTO 字号:T | T 用户身份认证是互联网金融发展的基石.今年三月,在德国汉诺威举办的IT展览 ...

  8. Vue中根据输入的身份证号识别年龄、性别

    需求: 根据用户输入的身份证号识别出年龄和性别,回显到相应的输入框中 分析:定义身份证号的正则表达式,利用字符串的方法截取出相关字符进行判断 示例: <template> <div ...

  9. html5摄像头手势识别,基于OpenCV的摄像头动态手势轨迹识别及其应用

    [实例简介] 基于OpenCV的摄像头动态手势轨迹识别及其应用,前沿的研究,最新论文 2012 B_0% random t Xo X,XX 4_1.42.B0 Bhattacharyya glsl. ...

  10. 基于opencv和pillow实现人脸识别系统(附demo)

    更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 初中毕业读什么技校 http://cntkd.net 茂名一技http://www.enechn.com p ...

最新文章

  1. 计算机艺术未来发展趋势,计算机技术对现代艺术设计的影响
  2. 老生常谈,joomla wordpress drupal,你该选择哪个CMS?
  3. Magento 模版路径
  4. 【pmcaff专栏】项目管理失败?如何避免?
  5. python用pip安装_使用pip安装python库的几种常用方法
  6. Python 一键导出微信阅读记录和笔记,666!
  7. 小程序 仿麦当劳_手机上的麦当劳和星巴克:为什么现在首先使用移动应用程序...
  8. C语言 floor四舍五入,Math函數的四舍五入,Floor,Ceiling,Round的一些注意事項!...
  9. HAS_NO_PRIVILEGE解决方案
  10. 简单的Postman,硬是玩出花!我能咋办
  11. python去重计数_用Python实现透视表的value_sum和countdistinct功能
  12. JavaScript 错误 - Throw、Try 和 Catch
  13. 精读45-180程序转弯模板
  14. npy文件的处理方式
  15. 最新版esight安装(sql_server安装+esight超级详细)
  16. MATLAB基础知识——xlsread
  17. OpenWRT设置SmartDNS+ADGuardHome
  18. vue通过disabled控制按钮的置灰
  19. 免费的PDF转换器有哪些?小圆象PDF转换器办公达人必备工具
  20. 四川山海蓝图抖音播放量

热门文章

  1. UG标准件库的使用方法
  2. python中pygame学习——碰碰球(简单版)
  3. 气球java游戏,游戏 | 最适合春季玩气球的这12种玩法你玩过吗?
  4. PHP自学笔记 ---李炎恢老师PHP第一季 TestGuest0.5
  5. 如何清空c盘只剩系统_电脑C盘怎么清理到最干净?高手教你清理C盘的详细步骤...
  6. linux 802.11无线网卡驱动,Linux无线网络配置——无线网卡驱动安装与WLAN802.11配置...
  7. 拆分器控件Splitcontainer
  8. java 导出word简历_java导出生成word(类似简历导出)
  9. python爬取微博用户信息_Python爬取新浪微博用户信息及内容
  10. 交互式甘特图控件VARCHART XGantt教程:如何打印和导出图表(.NET版)