竞赛选题 基于视觉的身份证识别系统
0 前言
🔥 优质竞赛项目系列,今天要分享的是
基于机器视觉的身份证识别系统
该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate
1 实现方法
1.1 原理
1.1.1 字符定位
在Android移动端摄像头拍摄的图片是彩色图像,上传到服务器后为了读取到身份证上的主要信息,就要去除其他无关的元素,因此对身份证图像取得它的灰度图并得到二值化图。
对身份证图像的的二值化有利于对图像内的信息的进一步处理,可以将待识别的信息更加突出。在OpenCV中,提供了读入图像接口函数imread,
首先通过imread将身份证图像读入内存中:
id_card_img = cv2.imread(path_img)
之后再调用转化为灰度图的接口函数cvtColor并给它传入参数COLOR_BGR2GRAY,它就可以实现彩色图到灰度图的转换,代码如下
gray_id_card_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2GRAY)
preprocess_bg_mask = PreprocessBackgroundMask(boundary)
转化为二值化的灰度图后图像如图所示:

转换成灰度图之后要进行字符定位,通过每一行进行垂直投影,就可以找到所有字段的位置,具体如下:

然后根据像素点起始位置,确定字符区域,然后将字符区域一一对应放入存放字符的列表中:
vertical_peek_ranges = extract_peek_ranges_from_array(vertical_sum,minimun_val=40,minimun_range=1)vertical_peek_ranges2d.append(vertical_peek_ranges)
最后的效果图如图所示:

1.1.2 字符识别
身份证识别中,最重要的是能够识别身份证图像中的中文文字(包括数字和英文字母),这里学长采用深度学习的方式来做:
1)身份证图像涉及个人隐私,很难获取其数据训练集。针对此问题,我采用获取身份证上印刷体汉字和数字的数据训练集的方法,利用Python图像库(PIL)将13类汉字印刷体字体转换成6492个类别,建立了较大的字符训练集;
2)如何获取身份证图片上的字符是在设计中一个重要问题。我采用水平和垂直投影技术,首先对身份证图像进行预处理,然后对图片在水平和垂直方向上像素求和,区分字符与空白区域,完成了身份证图像中字符定位与分割工作,有很好的切分效果;
3)在模型训练中模型的选择与设计是一个重要的环节,本文选择Lenet模型,发现模型层次太浅,然后增加卷积层和池化层,设计出了改进的深层Lenet模型,然后采用Caffe深度学习工具对模型进行训练,并在训练好的模型上进行测试,实验表明,模型的测试精度达到96.2%。
1.1.3 深度学习算法介绍
深度学习技术被提出后,发展迅速,在人工智能领域取得了很好的成绩,越来越多优秀的神经网络也应运而生。深度学习通过建立多个隐层的深层次网络结构,比如卷积神经网络,可以用来研究并处理目前计算机视觉领域的一些热门的问题,如图像识别和图像检索。
深度学习建立从输入数据层到高层输出层语义的映射关系,免去了人工提取特征的步骤,建立了类似人脑神经网的分层模型结构。深度学习的示意图如图所示

1.1.4 模型选择
在进行网络训练前另一项关键的任务是模型的选择与配置,因为要保证模型的精度,要选一个适合本文身份证信息识别的网络模型。
首先因为汉字识别相当于一个类别很多的图片分类系统,所以先考虑深层的网络模型,优先采用Alexnet网络模型,对于汉字识别这种千分类的问题很合适,但是在具体实施时发现本文获取到的数据训练集每张图片都是6464大小的一通道的灰度图,而Alexnet的输入规格是224224三通道的RGB图像,在输入上不匹配,并且Alexnet在处理像素较高的图片时效果好,用在本文的训练中显然不合适。
其次是Lenet模型,没有改进的Lenet是一个浅层网络模型,如今利用这个模型对手写数字识别精度达到99%以上,效果很好,在实验时我利用在Caffe下的draw_net.py脚本并且用到pydot库来绘制Lenet的网络模型图,实验中绘制的原始Lenet网络模型图如图所示,图中有两个卷积层和两个池化层,网络层次比较浅。

2 算法流程

3 部分关键代码
cv2_color_img = cv2.imread(test_image)##放大图片resize_keep_ratio = PreprocessResizeKeepRatio(1024, 1024)cv2_color_img = resize_keep_ratio.do(cv2_color_img) ##转换成灰度图cv2_img = cv2.cvtColor(cv2_color_img, cv2.COLOR_RGB2GRAY)height, width = cv2_img.shape##二值化 调整自适应阈值 使得图像的像素值更单一、图像更简单adaptive_threshold = cv2.adaptiveThreshold(cv2_img, ##原始图像255, ##像素值上限cv2.ADAPTIVE_THRESH_GAUSSIAN_C, ##指定自适应方法Adaptive Method,这里表示领域内像素点加权和cv2.THRESH_BINARY, ##赋值方法(二值化)11, ## 规定领域大小(一个正方形的领域)2) ## 常数C,阈值等于均值或者加权值减去这个常数adaptive_threshold = 255 - adaptive_threshold## 水平方向求和,找到行间隙和字符所在行(numpy)horizontal_sum = np.sum(adaptive_threshold, axis=1)## 根据求和结果获取字符行范围peek_ranges = extract_peek_ranges_from_array(horizontal_sum)vertical_peek_ranges2d = []for peek_range in peek_ranges:start_y = peek_range[0] ##起始位置end_y = peek_range[1] ##结束位置line_img = adaptive_threshold[start_y:end_y, :]## 垂直方向求和,分割每一行的每个字符vertical_sum = np.sum(line_img, axis=0)## 根据求和结果获取字符行范围vertical_peek_ranges = extract_peek_ranges_from_array(vertical_sum,minimun_val=40, ## 设最小和为40minimun_range=1) ## 字符最小范围为1## 开始切割字符vertical_peek_ranges = median_split_ranges(vertical_peek_ranges)## 存放入数组中vertical_peek_ranges2d.append(vertical_peek_ranges)## 去除噪音,主要排除杂质,小的曝光点不是字符的部分filtered_vertical_peek_ranges2d = []for i, peek_range in enumerate(peek_ranges):new_peek_range = []median_w = compute_median_w_from_ranges(vertical_peek_ranges2d[i])for vertical_range in vertical_peek_ranges2d[i]:## 选取水平区域内的字符,当字符与字符间的间距大于0.7倍的median_w,说明是字符if vertical_range[1] - vertical_range[0] > median_w*0.7:new_peek_range.append(vertical_range)filtered_vertical_peek_ranges2d.append(new_peek_range)vertical_peek_ranges2d = filtered_vertical_peek_ranges2dchar_imgs = []crop_zeros = PreprocessCropZeros()resize_keep_ratio = PreprocessResizeKeepRatioFillBG(norm_width, norm_height, fill_bg=False, margin=4)for i, peek_range in enumerate(peek_ranges):for vertical_range in vertical_peek_ranges2d[i]:## 划定字符的上下左右边界区域x = vertical_range[0]y = peek_range[0]w = vertical_range[1] - xh = peek_range[1] - y## 生成二值化图char_img = adaptive_threshold[y:y+h+1, x:x+w+1]## 输出二值化图char_img = crop_zeros.do(char_img)char_img = resize_keep_ratio.do(char_img)## 加入字符图片列表中char_imgs.append(char_img)## 将列表转换为数组np_char_imgs = np.asarray(char_imgs)## 放入模型中识别并返回结果output_tag_to_max_proba = caffe_cls.predict_cv2_imgs(np_char_imgs)ocr_res = ""## 读取结果并展示for item in output_tag_to_max_proba:ocr_res += item[0][0]print(ocr_res.encode("utf-8"))## 生成一些Debug过程产生的图片if debug_dir is not None:path_adaptive_threshold = os.path.join(debug_dir,"adaptive_threshold.jpg")cv2.imwrite(path_adaptive_threshold, adaptive_threshold)seg_adaptive_threshold = cv2_color_img# color = (255, 0, 0)# for rect in rects:# x, y, w, h = rect# pt1 = (x, y)# pt2 = (x + w, y + h)# cv2.rectangle(seg_adaptive_threshold, pt1, pt2, color)color = (0, 255, 0)for i, peek_range in enumerate(peek_ranges):for vertical_range in vertical_peek_ranges2d[i]:x = vertical_range[0]y = peek_range[0]w = vertical_range[1] - xh = peek_range[1] - ypt1 = (x, y)pt2 = (x + w, y + h)cv2.rectangle(seg_adaptive_threshold, pt1, pt2, color)path_seg_adaptive_threshold = os.path.join(debug_dir,"seg_adaptive_threshold.jpg")cv2.imwrite(path_seg_adaptive_threshold, seg_adaptive_threshold)debug_dir_chars = os.path.join(debug_dir, "chars")os.makedirs(debug_dir_chars)for i, char_img in enumerate(char_imgs):path_char = os.path.join(debug_dir_chars, "%d.jpg" % i)cv2.imwrite(path_char, char_img)
4 效果展示



5 最后
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate
相关文章:
竞赛选题 基于视觉的身份证识别系统
0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…...
git详细教程
git详细教程 区域划分单分支操作git log语法常用的参数及其详解git log 结果 git refloggit diff常用的参数及其详解 git reset常用的参数及其详解 git checkoutgit rm常用的参数及其详解 git remote常用的参数及其详解 多分支切换代码融合git switch常用的参数及其详解 git br…...
[old]TeamDev DotNetBrowser Crack
TeamDev DotNetBrowser将 Chromium Web 浏览器添加到您的 .NET 应用程序中。在 WPF 和 WinForms 中显示现代网页。使用 DOM、JS、网络、打印等。在 Windows x86/x64/ARM64、macOS x64/Apple Silicon、Linux x64/ARM64 上运行,支持.NET Framework 4.5 特征 HTML5、C…...
Zynq-Linux移植学习笔记之63- linux内核崩溃的重启
1、背景介绍 在运行linux应用程序的时候,有时会遇到内核崩溃异常的情况,此时串口中会打印出内核崩溃时的堆栈情况,如下: 当出现这个情况后串口就死了,应用也停了,此时无法进行恢复。 之前写过可通过板子w…...
【精华】ubuntu编译openpose
文章目录 (1)参考资料(2)opencv编译(3)Openpose编译(4)异常问题 (1)参考资料 ubuntu20 openpose cuda11.7 cudnn8 opencv4.7.0_Nightmare004的博客-CSDN博客…...
第二届全国高校计算机技能竞赛——Java赛道
第二届全国高校计算机技能竞赛——Java赛道 小赛跳高 签到题 import java.util.*; public class Main{public static void main(String []args) {Scanner sc new Scanner(System.in);double n sc.nextDouble();for(int i 0; i < 4; i) {n n * 0.9;}System.out.printf(&…...
使用Webpack设置TS引用模块,解决Module not found: Error: Can‘t resolve ‘./m1‘ in ...问题
当我们把ts文件作为模块被引用的时候,我们使用Webpack打包代码会报错: Module not found: Error: Cant resolve ./m1 in ... 解决方法: 在webpack.config.js文件中配置如下代码: module.exports {// 设置引用模块resolve: {ext…...
北斗GPS网络时钟系统(子母钟系统)助力智慧教室建设
北斗GPS网络时钟系统(子母钟系统)助力智慧教室建设 北斗GPS网络时钟系统(子母钟系统)助力智慧教室建设 HR系列型NTP网络时钟系统是由我公司精心设计、自行研发生产的一套通过网口与母钟连接的子钟,接收母钟发送来的时间…...
蓝牙芯片香薰机智能化方案
RAMSUN提供的蓝牙芯片香薰机智能化方案,支持提供远程提前开启、多档位调节、工作模式切换等产品方案,可通过倒计时进行计时管理,实现免看管香薰,方便节能。 香薰机智能化方案采用的蓝牙芯片MS1656内置有M0内核的32位MCU,具有24MH…...
9.23 校招 实习 内推 面经
绿泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招 | 友道智途2024年校招开启&招聘投递Q&A(内推) 校招 | 友道智途2024年校招开启&招聘投递Q&A(内推) 2、校招 | ABB机器人…...
ARM 和 AMD 架构的区别
ARM 架构和 AMD 架构是两种不同的计算机处理器架构,它们有以下几个主要区别: 设计出发点: ARM 架构:ARM 架构最初是为嵌入式系统设计的,旨在提供低功耗和高效能的解决方案。它主要应用于移动设备、嵌入式系统和物联网设…...
Logstash、sharding-proxy组件高级配置
记录Logstash数据同步插件在分库分表场景下相关高可用、高并发配置 一、Logstash 1.配置文件控制任务数 vim /etc/logstash/logstash.yml pipeline.workers: 24 pipeline.batch.size: 10000 pipeline.batch.delay: 10 Logstash建议在修改配置项以提高性能的时候,每…...
【Elasticsearch】简单搜索(三)
简介:Elasticsearch(ES)是一个开源的分布式搜索和分析引擎,用于快速存储、搜索和分析大量数据。它具有高性能、可扩展性和灵活性的特点,被广泛用于构建实时搜索、日志分析、数据可视化等应用。 这篇文章主要介绍检索相…...
【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析
简述 当进行需求分析时,通常着重考虑三个主要层次:业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性,用户需求明确最终用户的期望,而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…...
Linux基础知识 总结
Linux基础知识 总结 1、Clion的简单介绍 CLion是以IntelliJ为基础,专为开发C及C所设计的跨平台IDE,可以在Windows、Linux及MacOS使用,这里我是在ubuntu 16.0.4基础上安装。2、下载 Linux版Clion的.tar.gz的压缩包 wget https://download.j…...
网上申请流量卡要不要身份证?填写的信息安全吗?
网上申请流量卡要不要身份证?当然是要的! 现在直接从营业厅办理流量卡的很少了,都是直接在网上申请大流量卡,在这里小编提醒大家,在网上申请大流量卡和激活时都是需要提供个人证件的。 申请时提供身份证号是为了运营…...
关于计算机缺失vcruntime140.dll文件的解决方法分享
在计算机系统中,DLL(动态链接库)是一种特殊的文件类型,它包含了可以被多个程序共享的代码和数据。其中,VCRuntime140.dll是一个由Microsoft Visual C Redistributable package提供的运行时库文件,它为许多M…...
华为乾坤区县教育安全云服务解决方案(2)
本文承接: https://blog.csdn.net/qq_37633855/article/details/133276200?spm1001.2014.3001.5501 重点讲解华为乾坤区县教育安全云服务解决方案的部署流程。 华为乾坤区县教育安全云服务解决方案(2) 课程地址解决方案部署整体流程组网规划…...
PL/SQL异常抓取
目录 1. -- 什么是异常 2. 如何捕获预定义异常? 3.捕获异常的两个函数 SQLCODE :为错误代码返回一个数值 SQLERRM : 返回字符串的数据,包含了与错误相关的信息. 1. -- 什么是异常 DECLARE V_JOB EMP.JOB%TYPE; BEGIN SELECT JOB INTO V_JOB FROM EMP WHERE JOB CLERK; D…...
Java 18的未来:新特性和编程实践
文章目录 引言新特性预览1. 基于值的类的进一步改进2. 模式匹配的增强3. 新的垃圾回收器4. 扩展的模块系统5. 更强大的异步编程 编程实践示例1:基于值的类示例2:模式匹配的增强示例3:新的垃圾回收器 结论 🎉欢迎来到Java学习路线专…...
2026前端面试必杀技:大白话详解高频面试题
2026前端面试必杀技:大白话详解高频面试题 这篇全是大白话、超详细,覆盖HTML/CSS、JS基础/进阶、框架、网络、工程化、性能、手写题、项目8大模块,2026年高频题全覆盖,看完直接上战场。 一、HTML/CSS 基础(必问&#x…...
Dankoe新作《使命与收益》读书笔记 7|你不是迷茫,你只是不敢面对真正的自己
"我不知道自己想要什么。" 这大概是30岁前后最常说的一句话。辞职不敢,创业不会,留下来又不甘心。于是我们把迷茫当成一种身份,穿在身上,仿佛承认迷茫就不必为停滞负责。 但Dan Koe在《使命与收益》里说了一句扎心的话…...
保姆级教程:用Cadence Sigrity Power DC为海思HI3516A板卡提取电源树(附常见报错处理)
从零掌握Cadence Sigrity Power DC电源树提取:HI3516A实战避坑指南 刚拿到海思HI3516A评估板时,电源网络分析往往是硬件工程师的第一个拦路虎。面对密密麻麻的PCB走线和数十个电源域,传统手动梳理方式不仅耗时费力,还容易遗漏关键…...
硬币凑钱--动态规划--完全背包的变式
1.硬币凑钱import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int nsc.nextInt();//背包问题的其中一种int[] dpnew int[n1];for(int i1;i<n…...
告别手动点鼠标!用Python脚本批量跑Simulink仿真,效率提升10倍
告别手动点鼠标!用Python脚本批量跑Simulink仿真,效率提升10倍 在工程仿真领域,Simulink无疑是建模与分析的利器。但当面对参数扫描、蒙特卡洛分析或设计迭代等需要大量重复仿真的场景时,手动操作不仅效率低下,还容易…...
阿里开源Z-Image镜像体验:ComfyUI可视化生成汉服美女实战
阿里开源Z-Image镜像体验:ComfyUI可视化生成汉服美女实战 1. 开篇:当汉服遇见AI绘画 想象一下,你只需要输入"一位穿着汉服的中国女性站在樱花树下",AI就能在几秒钟内生成一张细节精致的写实风格图像。这不再是科幻场景…...
多宽带联网(五) OpenWrt中MWAN3高级策略分流实战(游戏加速、视频优化场景)
1. MWAN3策略分流的核心价值 家里拉了两条宽带却发现刷视频卡、打游戏延迟高?这种情况我遇到过太多次了。去年给朋友家调试网络时,他同时接了电信和联通两条200M宽带,但看4K视频还是缓冲,玩外服游戏延迟总在200ms以上。后来用Open…...
Z-Image-Turbo LoRA Web服务安全加固:禁用前端覆盖负面提示+后端content policy双层防护
Z-Image-Turbo LoRA Web服务安全加固:禁用前端覆盖负面提示后端content policy双层防护 1. 项目概述与安全挑战 造相-Z-Image-Turbo 亚洲美女LoRA Web服务是一个基于Z-Image-Turbo模型的图片生成平台,集成了laonansheng/Asian-beauty-Z-Image-Turbo-To…...
从ULN2803芯片内部拆解,聊聊三极管“黄金搭档”达林顿管到底强在哪?
ULN2803芯片拆解:达林顿管如何成为三极管的“黄金搭档”? 当我们需要用单片机的微弱IO口信号(通常只有几毫安)驱动继电器、电机这类“大胃王”负载时,就像试图用一根吸管给游泳池注水——理论可行,实际效率…...
KEPServerEX与SQLServer数据库的无缝集成指南
1. KEPServerEX与SQLServer集成的核心价值 在工业自动化和数据采集领域,KEPServerEX作为领先的通信平台,与SQLServer数据库的集成能够实现设备数据到关系型数据库的高效流转。这种组合特别适合需要长期存储设备运行数据、生成生产报表或进行数据分析的场…...
