身份证号码识别

article/2025/1/14 1:12:02

初次接触OCR技术,OCR技术在工业检测上有极大的用处,如工件上面得数字标号识别、印刷纸票识别、车牌识别、身份证号码识别等。但中文字体识别较难,如今百度OCR、谷歌tesseract等提供识别接口,可以取得较好的识别效果。
通过贾志刚老师的印刷字体识别课程和一些OpenCV函数的学习,用身份证号码识别检测一下所学知识。
主要步骤

  1. 使用OpenCV进行图像仿射变换或者透视变换,将图像摆正;
  2. 通过二值化和形态学处理,粗定位文本信息区域;
  3. 分割ROI区域,通过轮廓筛选,确定身份证号码区域;
  4. 字符分割和字符排序;
  5. 字符识别模型训练;
  6. 字符识别。

具体实现:
1、透视变换
先检测身份证外轮廓,获取身份证四个角点,然后利用OpenCV中getPerspectiveTransform()函数获取变换矩阵,warpPerspective()函数透视变换。特别需要注意角点坐标的顺序必须按顺序一一对应,按顺序找到对应坐标0123分别是 左上,右上,右下,左下。

#轮廓检测
cnts,hierarchy = cv.findContours(edged, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# cnts = sorted(cnts, key = cv.contourArea, reverse = True)[:5]
for c in cnts:peri = cv.arcLength(c,True)approx = cv.approxPolyDP(c,0.02*peri,True) #轮廓多边形逼近,找到角点if len(approx) == 4:screenCnt = approx#print(screenCnt)breakcv.drawContours(gray, [screenCnt], -1, (0, 255, 0), 2)
pts = screenCnt.reshape(4, 2)
#print(a)rect = np.zeros((4, 2), dtype = "float32")# 按顺序找到对应坐标0123分别是 左上,右上,右下,左下
# 计算左上,右下
s = pts.sum(axis = 1)
rect[0] = pts[np.argmin(s)]
rect[2] = pts[np.argmax(s)]# 计算右上和左下
diff = np.diff(pts, axis = 1)
rect[1] = pts[np.argmin(diff)]
rect[3] = pts[np.argmax(diff)](tl, tr, br, bl) = rect# 计算输入的w和h值
widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max(int(widthA), int(widthB))heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max(int(heightA), int(heightB))# 变换后对应坐标位置
dst = np.array([[0, 0],[maxWidth - 1, 0],[maxWidth - 1, maxHeight - 1],[0, maxHeight - 1]], dtype = "float32")# 计算变换矩阵
M = cv.getPerspectiveTransform(rect, dst)
warped = cv.warpPerspective(img, M, (maxWidth, maxHeight))

在这里插入图片描述
在这里插入图片描述
2、文本粗定位
通过Canny边缘检测,提取文本边缘,但此时边缘之间是断开的,需要通过形态学膨胀操作,将边缘之间连接起来。

canny = cv.Canny(gray,60,255)# 形态学操作
kernel = cv.getStructuringElement(cv.MORPH_RECT,(11,5))
dilation = cv.dilate(canny,kernel,iterations = 1)

在这里插入图片描述
3、身份证号码ROI分割
观察到身份证号码区域的长度是最长的,因此可以通过轮廓检测,用boungdingRect()函数计算各轮廓的长宽值,设定合适阈值,找到ROI区域的轮廓进行分割。

#轮廓检测
cnts,hiri = cv.findContours(dilation, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
for c in cnts:x, y, w, h = cv.boundingRect(c)if w < 250:continuecv.rectangle(gray, (x,y), (x+w,y+h), (255,0,0), 2)dst = src[y-2:y + h, x:x + w]

4、字符分割与排序
因为数字字符是连接的,字符之间有间隙,可以直接使用轮廓提取,因此可以以此为据,分割字符。轮廓的检测不能保证是有序的,通过轮廓的X坐标进行排序,字符排序保证以正确顺序依次进行识别。

# 字符分割
contours, hireachy = cv.findContours(canny1, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
#获取字符
rois = []
for c in range(len(contours)):box = cv.boundingRect(contours[c])if box[3] < 10:continuerois.append(box)# 字符排序
num = len(rois)
for i in range(num):for j in range(i+1, num, 1):x1, y1, w1, h1 = rois[i]x2, y2, w2, h2 = rois[j]if x2 < x1:temp = rois[j]rois[j] = rois[i]rois[i] = temp

在这里插入图片描述
5、识别模型训练
样本的准确采集与最后的结果准确度息息相关,将上述分割的字符进行样本拓展,因为数字像素特征比较明显,因此将像素特征作为输入,采用OpenCV封装的SVM网络进行训练与识别。

# 获取数据
train_data, train_labels = load_data()# 网络构建
svm = cv.ml.SVM_create()
svm.setKernel(cv.ml.SVM_LINEAR)
svm.setType(cv.ml.SVM_C_SVC)
svm.setC(2.67)
svm.setGamma(5.383)
svm.train(train_data, cv.ml.ROW_SAMPLE, train_labels)
svm.save("svm_data.yml")svm = cv.ml.SVM_load("svm_data.yml")
result = svm.predict(train_data)[1]
print(result)

6、身份证号码识别

#数字识别
svm = cv.ml.SVM_load("svm_data.yml")
result = svm.predict(digit_data)[1]
text = ""
for i in range(len(result)):text += str(np.int32(result[i][0]))
print(text)

在这里插入图片描述


http://chatgpt.dhexx.cn/article/12nDGdDc.shtml

相关文章

身份证号规则校验

我们国家目前公民身份证号为15位或者18位&#xff0c;且最后一位可能出现字母X。其中&#xff0c; 15位身份证为我国第一代身份证&#xff0c;基本已经退出历史舞台。其规则如下&#xff1a; 前1、2位数字表示&#xff1a;所在省份的代码&#xff1b; 第3、4位数字表示&…

opencv识别身份证号

opencv 识别身份证号 python模块 opencvpytesseractPIL 1.模块安装 1.1 opencv安装 通过pip进行安装&#xff0c;在此不再叙述 注意安装版本&#xff0c;以下是python3的安装方式 pip install opencv-python1.2 pytesseract安装 通过pip进行安装&#xff0c;在此不再叙述…

[转]【读书笔记】《俞军产品方法论》——产品经理的枕边书

作者简介 俞军&#xff0c;1997年毕业于同济大学化学系。曾任百度产品副总裁、首席产品架构师&#xff0c;网名“搜索引擎9238”&#xff0c;有“百度贴吧之父”之称。滴滴前高级产品副总裁。 内容简介 摘抄语录 我的产品潜力和优势大约只来自三方面&#xff1a;第一&#xff0…

话说产品方法论——需求与用户研究

开一个坑&#xff0c;结合自身经历和现在在看的一些书&#xff0c;将一些基础的产品方法论总结出来&#xff0c;与大家交流的同时鞭策自己。 作为0岁的产品经理&#xff0c;我们在学习产品方法论时&#xff0c;容易偏重于产品设计的理论&#xff0c;对产品设计的喜爱也许是多数…

CRM产品方法论

导语&#xff1a;CRM&#xff08;客户关系管理&#xff09;是一种企业与现有客户及潜在客户之间关系互动的管理系统&#xff0c;通过对客户数据的历史积累和分析&#xff0c;CRM可增进企业与客户之间的关系&#xff0c;从而增加企业销售收入和提高客户留存率。本文作者从目标、…

《俞军产品方法论》:一个产品学派的诞生

www.pmcaff.com 本文为作者 一只特立独行的Eric 于社区发布 “我有时下班打个顺风车&#xff0c;周围几大公司&#xff08;滴滴、百度、新浪、网易&#xff09;的产品经理都会来接我。因为我用的是真名。”俞军2017年接受PingWest采访时说道。 作为中国最有影响力的产品经理之一…

AI产品方法论之“由用户来完成AI产品设计的最后一公里”

前言&#xff1a;AI产品落地&#xff0c;非常有意思&#xff0c;也非常有难度&#xff0c;究其原因&#xff0c;除了AI技术、产品、行业、人才、用户等各方面都还没成熟&#xff0c;还有一个很重要的问题&#xff0c;就是我们还没有将互联网时代的产品方法论升级成为"AI产…

产品经理 - 产品设计方法论需求分析部分

整体 – 产品设计方法论思维导图 个人整理&#xff0c;存在异议大家可以讨论下 需求分析方法论 需求分析为需求收集的延展&#xff0c;需求收集后即需进行需求分析&#xff0c;拆解需求后方可业务落地&#xff0c;此处我将其分为两步&#xff0c;一是主动发散型需求分析&am…

产品经理方法论

企业以产品为媒介&#xff0c;与用户进行价值交换&#xff1b;产品经理要能在实践中理解用户模型和交易模型&#xff0c;设计产品促成更多交易&#xff0c;以创造有利可图的用户价值。 1、企业、用户、产品的关系 用户价值和商业价值的关系&#xff0c;是企业以产品为媒介&…

《俞军产品方法论》- 站在更高的角度来拓展产品经理的内涵和边界

关于作者 俞军&#xff0c;互联网产品大神级人物。他是早年百度唯一的产品经理&#xff0c;主持了百度搜索这款产品的无数次进化&#xff0c;并主持设计了百度贴吧、百度 知道等世界级创新产品&#xff0c;后来又成为滴滴出行的产品负责人。他的 “ 俞军产品经理十二条 ” &a…

产品方法论—如何竞品分析

一、概要 什么是竞品分析&#xff0c;单从组词法来说&#xff0c;竞品分析就是对竞争产品的分析&#xff0c;接下来将详细讲述到底应该如何进行竞品分析… 1、什么是竞品分析 在两个或者多个竞争产品之间&#xff0c;他们有什么样的商业模式&#xff0c;有什么样的定位&…

《产品方法论》读书笔记

写在前面&#xff1a;本文仅仅是根据个人阅读习惯或个人有启发之处所记录的笔记&#xff0c;不代表该书的重点哦>o< 全书内容的简单总结 企业以产品为媒介&#xff0c;与用户进行价值交换&#xff1b;产品经理要能在实践中理解用户模型和交易模型&#xff0c;设计产品促…

产品经理 - 产品设计方法论业务落地部分_包括流程产品文档方法论需求设计方法论

整体 - 产品设计方法论思维导图 个人整理&#xff0c;存在异议大家可以讨论下 业务落地方法论 在进行了需求收集以及需求分析后&#xff0c;针对收集到的需求以及对应的分析结论后&#xff0c;需针对当前的需求点进行开发落地&#xff0c;核心即为两点&#xff0c;需求设计…

产品方法论(三)

《结网》系列读书笔记 这本书已经被陆续的读完了&#xff0c;总结总是落后半拍&#xff0c;坏处是容易遗漏细节&#xff0c;不过这样也有好处&#xff1a;那就是总结思考&#xff0c;把对我印象最深的写出来。 产品经理的工作流程 检查和体验产品 腾讯的pony ma不只是作为ce…

以产品当笔,与世界对话——《俞军-产品方法论》

什么是产品经理&#xff1f; 1.历史上的产品经理 消费时代的产品经理 1926年&#xff0c;宝洁推出了一款叫卡玫尔&#xff08;Camay&#xff09;的香皂&#xff0c;跟宝洁公司自家的另一款象牙牌&#xff08;Ivory&#xff09;香皂很相似&#xff0c;但销量一直不佳。 象牙皂…

「产品读书」俞军产品方法论

在阅读这本书之前&#xff0c;第一个能想到的不相上下的产品书籍就是网易的《幕后产品》&#xff0c;对于我来说&#xff0c;网易的产品一直是我最为钦佩和喜欢的&#xff0c;但是互联网界的产品名声最大的除了张小龙&#xff0c;我估计就是俞军了&#xff0c;读这本书之前我提…

产品设计---产品从0到1,阐述各阶段的产品方法论

产品从0到1&#xff0c;阐述各阶段的产品方法论 产品分析的“五要素法”是什么&#xff1f;需求采集的“Z字采集法”又是什么&#xff1f;如何用“KANO模型”对需求进行分类及优先排序&#xff1f;如何确定MVP&#xff1f;“Hooked模型”是如何让用户对产品上瘾的&#xff1f;…

【centos7x86】安装源 设置基础软件仓库时出错 解决办法

设置阿里源&#xff0c;手敲下面的地址&#xff0c; 更新 &#xff1a; 现在需要勾选https&#xff0c;http取消了

CentOS8.3安装时安装源设置基础软件仓库时出错

报错如下&#xff1a;安装源设置基础软件仓库时出错 使用的iso镜像是CentOS-8.3.2011-x86_64-boot.iso&#xff0c;在阿里云的镜像中下载的。 下载地址&#xff1a;CentOS-8.3.2011-x86_64-boot.iso 解决方案&#xff1a; 首先设置好网络和主机名&#xff0c;确保能连接网络 …

安装 centos8 设置基础软件仓库时出错

安装时没截图 找个centos7的图,将URL换成下方自己的版本 版本 8 mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/版本 8.2.2004 mirrors.aliyun.com/centos/8.2.2004/BaseOS/x86_64/os/版本 8.3.2011&#xff08;目前最新&#xff09; mirrors.aliyun.com/centos/8.3.2011/…