目录
前言
课题背景和意义
实现技术思路
实现效果图样例
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯深度学习身份证号码检测识别
课题背景和意义
前1、2位数字表示所在省份的代码;第3、4位数字表示所在城市的代码;第5、6位数字表示所在区县的代码;第7~14位数字表示出生年、月、日;第15、16位数字表示所在地的派出所的代码;第17位数字表示性别,奇数表示男性,偶数表示女性;第18位数字是校检码,一般是随计算机随机产生, 用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。身份证号码自动识别在日常生活中有重大意义。
实现技术思路
识别流程
灰度图获取
读取图片之后,对图片进行处理,获得图片的灰度图。方法有二:
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对输入的图片进行预测,找出与输入图片的特征最相似的结果,就是结果。
实现效果图样例
我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。
毕设帮助,疑难解答,欢迎打扰!