赞
踩
前言:
本篇博客主要介绍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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。