一、前言
本文主要实现身份证图像上身份证号码的自动识别,在Qt平台上使用opencv进行图像处理,并绘制简单的用户界面,设计了基于Qt和opencv的身份证号码识别系统。
二、用户界面
以下是一些简单的控件,这里只是实现了身份证号码的识别,没有汉字(名字和地址)的识别,水平还不够。
三、身份证图像处理流程
下图是身份证识别系统的系统框图。
四、图像二值化处理
在获取另一个图像(即彩色身份证的图像)之后,选择r分量作为彩色图像的灰度化,然后对图像进行二值化,使得身份证号码的颜色和背景颜色差异很大。 这里需要获取图像的全局阈值和本地阈值。 当通过Otsu算法(实现了opencv )获得整个图像的全局阈值t、通过Beresen方法获得感兴趣的像素的域窗口中的灰度平均值Tbn、并使用整个图像的最大灰度值和最小灰度值获得一个校正因子b时,获得第二校正因子b
这里,t是Ostu全局阈值,Tbn由以下公式确定。
b由以下公式决定。
这里,g2是图像中的灰度的最大值,g1是图像中的灰度的最小值,c是经验系数,通常使用函数OstuBeresenThreshold实现0.12算法,实现的效果如下。
五、身份证号码定位
对二值化图像进行背景黑色处理,对居民票号进行黑白反转处理,然后进行闭图像操作后,利用findContours检测二值图像中白色像素块的轮廓,提取符合长宽比和面积要求的轮廓。 找到的配置文件如下:
要识别汉字,可以在这一部分对齐汉字区域进行剪切
六、号码分割
获取的裁剪后的id号图像缩小为300*20的分辨率尺寸。 如下所示
在该图像中,显然id编号与背景图像颜色的区分较高,所以在反转颜色后,用Otsu法进行二值化时得到
要分割编号,只需分割列,即进行统计
其中f(x,y )是介于两个字符之间的像素,该过程通过函数char_segment实现
七、特征提取
提取数字字符特征向量,即梯度分布特征灰度分布特征水平投影直方图垂直投影直方图,最后得到每个字符1*72的特征向量,用calcGradientFeat函数实现
八、神经网络训练
所用训练图像均由多个身份证图像分割得到,然后经过特征提取,得到的训练矩阵和标签矩阵保存在ann_xml.xml文件中,由函数getAnnXML实现,并从ann_train中读取训练矩阵和标签矩阵
九、分类器分类
利用训练的神经网络对提取的字符特征向量进行分类,用函数classify实现。
十、校验位计算
由于最后一位的识别率可能不高,最后一位的分割结果可能不好,所以最后一位的奇偶校验位直接从前17位的数字开始计算,由getParityBit函数来实现。
十一、结果显示
该身份证号码识别系统处理的图像,需要身份证区域尽可能占据整个图像的更多区域,并且在单色背景下拍摄。 另外,拍摄的身份证图像必须尽可能均匀地照亮,不存在高亮。 如下所示
系统识别结果如下。
使用的身份证照片都来自百度搜索
源程序下载: http://download.csdn.net/detail/AP 1005834/9530222