Opencv+C++之身份证识别(一)

五月份各种课程,也是最后一个学期了,所以就没有跟大家分享自己的一些所学。现在课程终于结束了,即将开始下一阶段的项目开发,所以趁这个间隙把前段时间做的一些东西做一个总结吧。

言归正传,对各种证件的识别系统大家都不陌生,尤其是对车牌号的识别已经应用到我们生活的很多方面,例如小区摄像头对入库车辆车牌的识别,高速收费站前对车牌识别的摄像头等。那么对身份证信息的识别跟其它识别有什么区别呢,我想主要是对身份证的识别是在一个相对静态的环境下,受环境,光照等的扰动比较小,一般都是先对身份证摄像后,通过系统对身份证上的信息进行识别;第二点就是它跟其它证件一样,证件上的信息都有固定的颜色和位置,这样对我们第二步的分割就有很大的帮助。分析了身份证的固有特性后,简单说下我们系统的功能:1)将各个目标信息从身份证图片中分割出来,例如姓名信息,住址信息等;2)对分割出来的信息进行识别,最基础的要求是能统计出各个目标中汉字个数,数字个数,字母个数和特殊字符个数等,本次开发,我只是实现了对数字的识别并对汉字的识别提出自己的可行性方法,因为时间缘故没有花很多时间去实现对汉字的识别;

先给出几张我们实验用的照片:

Opencv+C++之身份证识别(一)_第1张图片Opencv+C++之身份证识别(一)_第2张图片Opencv+C++之身份证识别(一)_第3张图片

当然这三张只是实验图片的一部分,但是又是很有代表性,第一张属于比较标准的,清晰的身份证图片,第二幅图片中身份证边界没有跟图片边界贴近,并且受到了光照不均的影响,第三张中身份证角度稍微有些倾斜,并且身份证的边界没有被照到。实际上这三张就代表了我们实际应用的测试图片,因为我们要使用识别系统,是人为的去对身份证拍摄,再将图片信息进行系统处理的,所以我们可以假定摄像时身份证同摄像头平行,并且身份证区域占整个图片区域的5/6以上;

下面就开始我们的实践阶段,该系统的开发主要分为三个阶段:图像预处理;目标区域分割;目标区域信息识别;

(1)预处理阶段主要是要将图片中的一些噪音,扰动过滤掉。

  1)要提取目标区域信息,首先想到将图像进行灰度化,常用的灰度化方法很多,像分量法,加权法,均值法等等。但是通过实验发现,直接提取彩色图的R通道灰度图是最好的选择,因为该灰度图中前景和背景的对比度最大。如下图所示

Opencv+C++之身份证识别(一)_第4张图片Opencv+C++之身份证识别(一)_第5张图片Opencv+C++之身份证识别(一)_第6张图片

通过灰度化后可以明显看出,我们先要提取的前景信息,相对于背景来说有明显的灰度对比(暂时先不用考虑头像部分,因为该部分位置相对固定,通过位置信息可以将其过滤)

 2)通过获取局部最佳阈值来作为自适应的全局阈值;根据我们对身份证图片的假定和位置信息可以知道,在图片中心区域的左侧可以提取一个矩形区域,其中一定包含前景信息,通过获取该区域的最佳阈值,就可以近似作为整副图片的全局阈值;当然这样做也只是对图像做一个粗糙的过滤,因为受光照等的影响,局部阈值跟全局阈值会有一定的差异。但在后面的各个区域的获取中,我们有方法来进一步精确。

步骤如下1.在该区域内选择一个T作为初始估计值;

           2.用T分割图像,这样做会生成两组像素:G1由所有灰度值大于T的像素组成,而G2由所有灰度值小于或者等于T的像素组成。

           3.对于区域G1和G2中的所有像素计算平均灰度值u1和u2

           4.计算新的门限值: T=(u1+u2)/2

           5.重复步骤2到4,直到逐次迭代所得的T值之差小于事先定义好的参数P

通过阈值处理得到如下结果

Opencv+C++之身份证识别(一)_第7张图片Opencv+C++之身份证识别(一)_第8张图片Opencv+C++之身份证识别(一)_第9张图片

(2)对图像进行预处理后,下一步就是对目标区域的提取。这一步我主要是用到了身份证中各个区域的位置信息,利用身份证号的特殊位置,和它本身相对固定的组成(18个数字或字母)先提取出身份证号的区域,在根据该区域与其它区域的相对位置获得其它目标对象的区域范围。这样就完成了第一步的分割任务。示例图如下

Opencv+C++之身份证识别(一)_第10张图片

你可能感兴趣的:(opencv)