opencv识别身份证号

article/2025/1/14 1:15:10

opencv 识别身份证号

python模块

  • opencv
  • pytesseract
  • PIL

1.模块安装

1.1 opencv安装

通过pip进行安装,在此不再叙述 注意安装版本,以下是python3的安装方式

pip install opencv-python

1.2 pytesseract安装

通过pip进行安装,在此不再叙述 注意安装版本,以下是python3的安装方式

pip install pytesseract

除此之外,需要安装 Tesseract-OCR。

windows 环境

前往Teaseract-OCR 下载exe,然后双击程序安装即可,可以勾选Additional language data(download)选项来安装OCR识别支持的语言包,但下载语言包实在是慢,我们可以直接从 tessdata下载zip的语言包压缩文件,解压后将tessdata-master中的文件复制到Tesseract的安装目录C:\Program Files (x86)\Tesseract-OCR\tessdata目录下,最后我们配置下环境变量,我们将C:\Program Files (x86)\Tesseract-OCR添加到环境变量中。

linux 环境

在Ubuntu、Debian、Deepin系统中,安装命令如下:

#安装tesseract
sudo apt-get install -y tesseract-ocr libtesseract-dev libleptonica-dev#安装语言包
git clone https://github.com/tesseract-ocr/tessdata.git
sudo mv tessdata/* /usr/share/tesseract-ocr/tessdata

在CentOS、Red Hat系统下,安装命令如下:

#安装tesseract
yum install -y tesseract#安装语言包
git clone https://github.com/tesseract-ocr/tessdata.git
mv tessdata/* /usr/share/tesseract/tessdata

1.3 PIL安装

通过pip进行安装,在此不再叙述 注意安装版本,以下是python3的安装方式

pip install pillow

2. 实现步骤

2.1 方向矫正

图片拍摄过程中,可能因为拍摄角度以及操作过程造成图片角度倾斜,影响识别的准确率,或者无法识别问题。通过透视矫正,可以很好的解决这一问题

  # 对图片进行旋转,得到变换矩阵M = cv2.getRotationMatrix2D(center, angle, 1.0)# 仿射变换,使得原图片根据变换矩阵进行变换cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

2.2 形态学变换

通过形态学的腐蚀膨胀来,使得去除一些干扰的噪点,使得身份证号区域进行合并,区域更大,能够更好的判断位置

   # 卷积核  5 x 5  此参数不是固定,根据实际情况调整,最好是奇数且不宜过大 如: 3,5,7,9kernel = np.ones((5,5),np.uint8)# 膨胀两个像素  iterations=2dst = cv2.erode(rotated,kernel,iterations=2)

2.3 寻找边框

寻找图片中所有边框,然后通过身份证号的边框特征,(如:宽度,高度,边框左上坐标,右下坐标,面积等等)进行筛选,最终确定身份证号边框,从而截取边框内容

contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE , cv2.CHAIN_APPROX_NONE)
# 遍历边框
for i in contours:# area = cv2.contourArea(i)# 边框最小矩形rect = cv2.minAreaRect(i)# 边框左上,左下,右上,右下坐标box = cv2.boxPoints(rect)box = np.int0(box)# 计算高和宽height = abs(box[0][1] - box[2][1])width = abs(box[0][0] - box[2][0])# 判断 身份证号 边框 特征if width > 0.4 * w and  10 <height< 0.3*h  and box[1][1] > 0.5 * h:print(box)

2.4 识别文字

通过pyteaseract进行识别身份证号文字,将截取的身份证号图片区域,识别出结果。注意:不可将cv2图片直接识别,需转换成pillow,识别时,添加白名单进行识别限定。

# cv2 转 pillow
image = Image.fromarray(cv2.cvtColor(idcard_img,cv2.COLOR_BGR2RGB))
# 识别
idcard = pytesseract.image_to_string(image,config="-c tessedit_char_whitelist=0123456789X")

3. 代码

import cv2
import pytesseract
from PIL import Image# tesseract 位置配置
tesseract_cmd = r'D:\\Tesseract-OCR\tesseract'
pytesseract.pytesseract.tesseract_cmd =tesseract_cmd# 获取边框
def num_box(path):img = cv2.imread(path)#灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#二值化retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)	    # 双边模糊,降噪threshold=cv2.bilateralFilter(src=threshold, d=0, sigmaColor=20, sigmaSpace=5)# 获取边框coords = np.column_stack(np.where(threshold < 127))#倾斜角度angle = cv2.minAreaRect(coords)[-1]if abs(angle) < 70:if angle < -45:angle = -(90+ angle)else:angle = -angleelse:angle = 0 #仿射变换h, w = threshold.shape[:2]center = (w//2, h//2)  #旋转中心M = cv2.getRotationMatrix2D(center, angle, 1.0)rotated_color = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)rotated = cv2.warpAffine(threshold, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)# 双边滤波降噪rotated =cv2.bilateralFilter(src=rotated, d=0, sigmaColor=5, sigmaSpace=5)# 寻找边框kernel = np.ones((5,5),np.uint8)dst = cv2.erode(rotated,kernel,iterations=2)contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE , cv2.CHAIN_APPROX_NONE)#遍历边框for i in contours:#边框点rect = cv2.minAreaRect(i)box = cv2.boxPoints(rect)box = np.int0(box)# 计算高和宽height = abs(box[0][1] - box[2][1])width = abs(box[0][0] - box[2][0])# 判断边框特征if width > 0.4 * w and  10 <height< 0.3*h  and box[1][1] > 0.5 * h:# 截取图片idcard_img =  rotated_color[min(box[2][1],box[0][1]):max(box[2][1],box[0][1]),min(box[0][0],box[2][0]):max(box[0][0],box[2][0])]# 灰度图识别便于识别gray_idcard = cv2.cvtColor(idcard_img, cv2.COLOR_BGR2GRAY)#cv2.imwrite("gray_idcard.png",gray_idcard)return gray_idcardreturn None#识别号码
def get_num(idcard_img):image = Image.fromarray(cv2.cvtColor(idcard_img,cv2.COLOR_BGR2RGB))idcard = pytesseract.image_to_string(image,config="-c tessedit_char_whitelist=0123456789X")return idcarddef ocr(path):idcard_img = num_box(path)if idcard_img is not None:idcard = get_num(idcard_img)return idcardreturn "" idcard = ocr("idcard1.png")
print(idcard)

效果

原图:
在这里插入图片描述

识别结果: 123456196108047890
在这里插入图片描述


http://chatgpt.dhexx.cn/article/0AQL6xrH.shtml

相关文章

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

作者简介 俞军&#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/…

vmware centos设置基础软件仓库时出错error set up base repository

如果是centOS8图片中的7修改为8 http://mirrors.aliyun.com/centos/7/os/x86_64 如果是centos8 也是一样的 http://mirrors.aliyun.com/centos/7/os/x86_64

BMS(电池管理系统)第八课—AUTOSAR基础软件层BSW简介

​为应对日益复杂的汽车电子软件开发&#xff0c;更新和维护的问题&#xff0c;AUTOSAR-AUTomotive Open System ARchitecture&#xff08;汽车开放系统架构&#xff09;联盟应运而生。在AUTOSAR分层模型中&#xff0c;软件模块及软件模块之间的接口定义更加标准化&#xff0c;…