身份证信息OCR识别提取

article/2025/8/1 13:08:04

要实现Python中的身份证OCR识别,可以采用以下步骤和工具(结合开源库和API服务),以下是两种主流方案:


方案1:使用第三方OCR API(推荐百度/腾讯云)

百度OCR API 示例
  1. 注册并获取API Key:百度AI开放平台
  2. 安装SDK
    pip install baidu-aip
    
  3. 代码实现
    from aip import AipOcrAPP_ID = '你的AppID'
    API_KEY = '你的API Key'
    SECRET_KEY = '你的Secret Key'client = AipOcr(APP_ID, API_KEY, SECRET_KEY)def baidu_id_card_ocr(image_path):with open(image_path, "rb") as f:image = f.read()# 调用身份证识别接口(正面: idcard_front, 背面: idcard_back)result = client.idcard(image, "front")# 提取结构化数据if "words_result" in result:return result["words_result"]return None# 输出结果示例:
    # {'姓名': {'words': '张三'}, '性别': {'words': '男'}, ...}
    

方案2:使用开源OCR库(推荐 PaddleOCR)

安装依赖
pip install paddlepaddle paddleocr opencv-python
示例代码
from paddleocr import PaddleOCR
import cv2# 初始化OCR模型(使用中英文超轻量模型)
ocr = PaddleOCR(use_angle_cls=True, lang='ch')  # 设置语言为中文def id_card_ocr(image_path):# 读取图片img = cv2.imread(image_path)# OCR识别result = ocr.ocr(img, cls=True)# 提取所有识别文本texts = [line[1][0] for line in result[0]]# 关键字段提取(简单规则匹配)info = {}for text in texts:if "姓名" in text:info["name"] = text.split("姓名")[-1].strip()elif "性别" in text:info["gender"] = text.split("性别")[-1][0]  # 取第一个字符elif "公民身份号码" in text:# 提取18位身份证号(兼容末尾X)id_num = ''.join(filter(str.isalnum, text))info["id_number"] = id_num[-18:].upper()# 添加更多字段(出生、住址等)...return info# 测试识别
result = id_card_ocr("id_card.jpg")
print(result)
优化方向
  1. 图像预处理(提高准确率):
    # 灰度化 + 二值化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY_INV)
    
  2. 字段精确匹配:使用正则表达式提取出生日期、地址等。
  3. 文字区域定位:通过轮廓检测或深度学习定位身份证关键区域。

关键问题处理

  1. 提高准确率

    • 图像预处理(去噪、增强对比度、透视矫正)
    • 使用高分辨率图像(建议≥1024px)
    • 针对身份证训练专用OCR模型(需标注数据)
  2. 字段结构化

    # 正则提取身份证号
    import re
    id_text = "公民身份号码 12345620000101123X"
    id_num = re.search(r'[1-9]\d{5}(19|20)\d{10}(\d|X)', id_text).group()
    
  3. 完整字段列表

    • 正面:姓名性别民族出生住址公民身份号码
    • 反面:签发机关有效期限

推荐工具对比

工具优点缺点
PaddleOCR免费、离线、可定制需调参优化
百度OCR高精度、开箱即用收费(免费额度有限)
Tesseract开源通用中文身份证精度较低

进阶建议

  • 关键区域裁剪:先使用目标检测模型(如YOLO)定位身份证区域再OCR。
  • 自定义训练:用PPOCR训练自己的身份证模型(需标注数据集)。
  • 活体检测:结合人脸识别技术验证身份证真伪。

通过上述方案,可快速实现身份证信息的自动化识别与结构化提取。


Python3.11.0 PaddleOCR3.0.0实战

官方文档

示例代码:
import cv2
import re
from paddleocr import PaddleOCR
from PIL import Image
import os
import jsonclass IDCardOCR:def __init__(self):# 初始化OCR模型,使用中文识别,关闭方向检测self.ocr = PaddleOCR(use_doc_orientation_classify=False,use_doc_unwarping=False,use_textline_orientation=False)# 定义身份证信息的正则表达式模板self.templates = {'姓名': r'姓名(?::|:|)(.+?)(?=性别)','性别': r'性别(?::|:|)(.+?)(?=民族)','民族': r'民族(?::|:|)(.+?)(?=出生)','出生日期': r'出生(?::|:|)(.+?)(?=住址)','地址': r'住址(?::|:|)(.+?)(?=公民身份号码)','身份证号码': r'公民身份号码(?::|:|)(.+)'}# 出生日期格式转换self.birth_date_pattern = r'(\d{4})(\d{2})(\d{2})'def recognize_id_card(self, image_path):# 读取图像img = cv2.imread(image_path)if img is None:return {"错误": f"无法读取图像: {image_path}"}# 使用PaddleOCR进行文本识别result = self.ocr.predict(input=image_path)# 提取所有识别的文本all_text = ""for line in result[0]['rec_texts']:all_text += line# 使用正则表达式提取身份证信息extracted_info = self._extract_info_from_text(all_text)return extracted_infodef _extract_info_from_text(self, text):info = {}# 替换一些干扰字符cleaned_text = text.replace(' ', '').replace('"', '')# 提取各字段信息for field, pattern in self.templates.items():match = re.search(pattern, cleaned_text, re.DOTALL)if match:value = match.group(1).strip()# 处理出生日期格式if field == '出生日期':value = re.sub(self.birth_date_pattern, r'\1年\2月\3日', value)info[field] = valuereturn infodef visualize_results(self, image_path, result, output_path='./id_card_result.jpg'):image = Image.open(image_path).convert('RGB')boxes = [line[0] for line in result[0]]txts = [line[1][0] for line in result[0]]scores = [line[1][1] for line in result[0]]im_show = draw_ocr(image, boxes, txts, scores, font_path='./fonts/simfang.ttf')im_show = Image.fromarray(im_show)im_show.save(output_path)print(f"可视化结果已保存至: {output_path}")def save_to_json(self, info, output_path='./id_card_info.json'):with open(output_path, 'w', encoding='utf-8') as f:json.dump(info, f, ensure_ascii=False, indent=4)print(f"识别结果已保存至: {output_path}")if __name__ == "__main__":# 使用示例ocr = IDCardOCR()# 替换为你的身份证图像路径image_path = 'C:\\Users\\FanZhou\\PycharmProjects\\test\\resources\\test_002.png'# 检查图像文件是否存在if not os.path.exists(image_path):print(f"错误:图像文件不存在: {image_path}")else:# 识别身份证信息result_info = ocr.recognize_id_card(image_path)# 打印识别结果print("\n身份证信息识别结果:")for key, value in result_info.items():print(f"{key}: {value}")# 保存结果到JSON文件ocr.save_to_json(result_info)
中间效果:

在这里插入图片描述


http://www.hkcw.cn/article/YGKeevomnS.shtml

相关文章

C++之string的模拟实现

string 手写C字符串类类的基本结构与成员变量一、构造函数与析构函数二、赋值运算符重载三、迭代器支持四、内存管理与扩容机制五、字符串操作函数六、运算符重载总结 手写C字符串类 从零实现一个简易版std::string 类的基本结构与成员变量 namespace zzh { class string { …

Linux的调试器--gbd/cgbd

1.引入 #include <stdio.h> int Sum(int s, int e) {int result 0;for(int i s; i < e; i){result i;}return result; } int main() {int start 1;int end 100;printf("I will begin\n");int n Sum(start, end);printf("running done, result i…

云原生 Cloud Native Build (CNB)使用初体验

云原生 Cloud Native Build&#xff08;CNB&#xff09;使用初体验 引言 当“一切皆可云”成为趋势&#xff0c;传统开发环境正被云原生工具重塑。腾讯云CNB&#xff08;Cloud Native Build&#xff09;作为一站式开发平台&#xff0c;试图解决多环境协作难题。 本文将分享c…

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

目录 1 运算放大电路基础 1.1 概述 1.1.1 基本结构 1.1.2 理想特性 1.2 运算放大分析方法 1.2.1 虚短 1.2.2虚断 1.2.3 叠加定理 2 同向比例运算放大电路 2.1 概述 2.1.1 基本电路结构 2.1.2 电路原理 2.2 仿真分析 2.2.1 电压增益 2.2.2 相位分析 3 反向比例运…

系统思考:经营决策沙盘

今年是我为黄浦区某国有油漆涂料企业提供经营决策沙盘培训的第二年。在这段时间里&#xff0c;我越来越感受到&#xff0c;企业的最大成本往往不在生产环节&#xff0c;而是在决策错误上所带来的长远影响。尤其是在如今这个复杂多变的环境下&#xff0c;企业面临的挑战愈发严峻…

Java线程:并发/并行区别、线程生命周期、乐观锁/悲观锁

并发、并行 进程 正在运行的程序(软件)就是一个独立的进程线程是属于进程的&#xff0c;一个进程中可以同时运行很多个线程进程中的多个线程其实是并发和并行执行的 并发 进程中的线程是由CPU负责调度执行的&#xff0c;但CPU能同时处理线程的数量有限&#xff0c;为了保证…

等保测评-Mysql数据库测评篇

Mysql数据库测评 0x01 前言 "没有网络安全、就没有国家安全" 等保测评是什么&#xff1f; 等保测评&#xff08;网络安全等级保护测评&#xff09;是根据中国《网络安全法》及相关标准&#xff0c;对信息系统安全防护能力进行检测评估的法定流程。其核心依据《信…

mysql的Memory引擎的深入了解

目录 1、Memory引擎介绍 2、Memory内存结构 3、内存表的锁 4、持久化 5、优缺点 6、应用 前言 Memory 存储引擎 是 MySQL 中一种高性能但非持久化的存储方案&#xff0c;适合临时数据存储和缓存场景。其核心优势在于极快的读写速度&#xff0c;需注意数据丢失风险和内存占…

QNAP MEMOS 域名访问 SSL(Lucky)

注意&#xff1a;下述是通过ssh、docker-compose方式安装docker的&#xff0c;不是直接在container station中安装的哈&#xff01;&#xff01;&#xff01; 一、编辑docker-compose.yml文件 用“#”号标识的&#xff0c;在保存文件的时候建议去掉&#xff0c;不然有时候会出…

BioID技术在宿主-病原体相互作用领域的应用

细菌感染是全球公共卫生的重大威胁&#xff0c;而抗生素耐药性的提升使我们迫切需要深入了解宿主 -病原体相互作用。细菌病原体通过分泌效应蛋白&#xff0c;操纵宿主细胞以建立感染。这些效应蛋白通过与宿主蛋白相互作用&#xff0c;改变宿主细胞功能&#xff0c;但传统研究方…

解析楼宇自控系统:分布式结构的核心特点与优势展现

在建筑智能化发展的进程中&#xff0c;楼宇自控系统作为实现建筑高效运行与管理的关键&#xff0c;其系统结构的选择至关重要。传统的集中式楼宇自控系统在面对日益复杂的建筑环境和多样化的管理需求时&#xff0c;逐渐暴露出诸多弊端&#xff0c;如可靠性低、扩展性差、响应速…

SAP Business One:无锡哲讯科技助力中小企业数字化转型的智慧之选

数字化转型&#xff0c;中小企业的必经之路 在当今竞争激烈的商业环境中&#xff0c;数字化转型已不再是大型企业的专利&#xff0c;越来越多的中小企业开始寻求高效、灵活的管理系统来优化业务流程、提升运营效率。作为全球领先的企业管理软件&#xff0c;SAP Business One…

Python基于Django的校园打印预约系统(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

身份证发给别人怎么加水印?赛文奥特曼身份证添加水印教程

我们经常需要使用身份证照片进行身份验证、资料提交等操作。然而&#xff0c;直接将身份证照片发送给他人或上传到网络存在一定的信息泄露风险。为了更好地保护个人隐私&#xff0c;我们可以使用 简鹿水印助手 这款工具&#xff0c;在身份证照片上添加专属水印&#xff0c;从而…

Express教程【002】:Express监听GET和POST请求

文章目录 2、监听post和get请求2.1 监听GET请求2.2 监听POST请求 2、监听post和get请求 创建02-app.js文件。 2.1 监听GET请求 1️⃣通过app.get()方法&#xff0c;可以监听客户端的GET请求&#xff0c;具体的语法格式如下&#xff1a; // 1、导入express const express req…

ESP32-C3 Vscode+ESP-IDF开发环境搭建 保姆级教程

1.背景 最近esp32的芯片很火&#xff0c;因为芯片自带了WIFI和BLE功能&#xff0c;是物联网项目开发的首选芯片&#xff0c;所以&#xff0c;我也想搞个简单的esp32芯片试试看。于是&#xff0c;我设计了一个简单的板子。如下 这块板子很简单&#xff0c;主要的电路来自于乐鑫…

深入 RAG(检索增强生成)系统架构:如何构建一个能查资料的大语言模型系统

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、LLM 的局限&#xff1a;模型知识“封闭” vs 现实知识…

VSCode+Cline 安装配置及使用说明

安装配置 打开VSCode&#xff0c;点击左侧Extension图标&#xff0c;在弹出页面中&#xff0c;检索Cline&#xff0c;选择Cline进行安装。 安装完毕&#xff0c;在左侧会出现一个图标&#xff0c;点击图标 选择【Use your own API key】&#xff0c;在出来的界面中选择大模型&…

【征求意见】四川省大数据发展研究会关于对《数据资源建设费用测算标准》团体标准征求意见的通知

四川省大数据发展研究会 关于对《数据资源建设费用测算标准》团体标准征求意见的通知 各有关单位&#xff1a; 由四川省大数据发展研究会归口、成都东契奇科技有限公司牵头编制的《数据资源建设费用测算标准》团体标准已形成征求意见稿&#xff0c;现公开征求意见。请于2025年…

下载即转化的商业密码:解析华为应用商店CPD广告的智能投放逻辑

在移动互联网流量红利见顶的背景下&#xff0c;华为应用市场凭借其终端生态优势正成为开发者获客的新蓝海。数据显示&#xff0c;2025年Q1华为应用商店全球分发量同比增长27%&#xff0c;其中CPD广告因其"下载才付费"的精准特性&#xff0c;已成为金融、游戏、工具类…