基于OpenCV的身份证号自动识别应用开发
基于OpenCV机器学习算法实现身份证号自动识别
1 前言
本文基于OpenCV图像处理算法和OpenCV提供的机器学习算法实现身份证号的自动识别。
应用(编程)环境:
语言:Java, JavaFXSDK(用于Java GUI编程)
开发包:OpenCV,KNearest
集成开发环境:Eclipse
2 应用界面
应用主界面如下图:
由于测试用的是本人真实证件,故图中进行了相应的隐私处理。
主界面说明:界面左上区域为实时视频采集显示区域,启动主机摄像头后显示。该区域右侧有两个较小的显示区域,其中上部显示实时的视频灰度化后的图像,下部细长的条状显示区域在程序成功检测到身份证号区域后显示所识别出的身份证号区域,是二值化的黑白图像。界面中间是三个功能按钮,最下部分是阈值显示以及最终识别结果显示区域。
点击‘Start/StopCamera’按钮启动计算机主机(推荐笔记本)摄像头工作。
点击‘Start/StopIdId’按钮启动身份证号实时识别。
将身份证正面对准摄像头,逐步逼近,程序每秒采样一次图像(可设置采样频率)进行识别。
滑动控件‘Threshold’用于调节识别参数(通常情况下基本不用调整),当整个视频/图像偏亮时可降低参数值,反之增大参数值。
成功识别后,界面下方IDs结果区域显示识别结果。
OpenCV提供的机器学习算法包括:正态贝叶斯、K最近邻、支持向量机、决策树、ADA Boost、梯度提升决策树、随机森林、人工神经网络、EM算法,示例代码中提供了K最近邻算法,程序可很方便地移植使用OpenCV的其他机器学习算法。
3 图像处理流程
应用中所有样本库数据来源均来自百度图片搜索(地址:http://image.baidu.com/),搜索关键字:‘身份证正面图片’。
图像处理流程既用于样本库(训练数据)的建立,也用于实时识别流程。主要功能是从输入图片中识别出身份证号区域,并将身份证号中的单个数字(包括某些身份证号最后一位校验码X)单独分割出来。流程如下:
注:在样本库的建立中,所用的样本图片全部来自百度搜索,在应用实时运行过程中,均使用的真实身份证实时采集获取输入图像的。
以以下输入图像为例:
图像转换为二值黑白图后如下:
灰度图像二值化可利用OpenCV的threshold(),adaptiveThreshold(), floodFill(), Canny()等方法实现。
图像分割算法是本人自己写的代码,主要思路是检测二值图像中的分割线(空白区域,例如例子中的黑色区域),利用分割线将图像分割为独立的矩形区域,算法细节参见代码(WyImgProc.jar包)。
分割结果(矩形区域外框)叠加到灰度图上的结果如下图:
可以看出,身份证号数字已经被单独识别并分割出来。
接下来判断分割结果,是否有连续的符合一定特征的区域,例如连续18个上下对齐间隔在预定范围的矩形区域。可针对不同应用特点灵活调整即可完成不同的识别任务,并不一定限于数字的识别。
提取单个数字矩形区域图像并作修剪,例如检测到图像倾斜超过阈值则执行必要的旋转加以调整、将单个数字图像缩放到指定的大小等。
提取后存储的数字图像如下图所示:
4 样本库(训练数据)建立
收集身份证样例,通过百度搜索共搜集42张身份证照片作为样本库样例图片,经过筛选和补充最后由31张采样图片生成样本库。
样例图片预处理(旋转,剪切)。
通过第3节描述的图像处理流程提取号码并标记(训练数据生成)。
生成的样本库(也是一个图像文件)如下:
样本的标记由样本所在行完成,例如数字0在第0行,字母X在第10行。每个样本的大小为22x30像素。
5 实时识别流程
源代码共享链接:https://pan.baidu.com/s/1c3XD2U0
提取密码: 5pe7