竞赛选题 python opencv 深度学习 指纹识别算法实现
1 前言
🔥 优质竞赛项目系列,今天要分享的是
🚩 python opencv 深度学习 指纹识别算法实现
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:4分
- 创新点:4分
该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate
2 指纹识别方式
目前市面上有两种指纹识别,分别是光学式和电容式指纹识别。
2.1 电容式指纹识别
电容式指纹识别要比光学式的复杂得多,其原理是将压力感测、电容感测、热感测等感测器整合于一块芯片中,当指纹按压芯片表面时,内部电容感测器会根据指纹波峰与波谷而产生的电荷差(或是温差),形成指纹影像,再通过与算法内部的指纹库进行匹配,从而完成指纹识别。

电容式指纹识别技术较为复杂,对技术研发和积累有较高要求,并且涉及大量专利,算法得实现也相对困难,所以目前全球只有少数公司能在这方面提供领先的技术产品。
2.2 光学式指纹识别
然后是光学式指纹识别,大家常见的指纹考勤机就是光学式指纹识别。
这类光学式指纹识别主要包括4个方面功能
- 1.指纹模块负责采集指纹图像。
- 2.数字信号处理器主要把采集到的指纹图像转化为数字信号。
- 3.微控制器是整个系统的控制单元,在这里将进行指纹的验证以及输出指令。
- 4.液晶显示器将输出指纹验证结果。
当我们把手指放在指纹考勤机上时,通过镜面反射原理,指纹模块就会采集指纹图像

接着指纹图像就会被数字信号处理器转换成数字信号

然后通过微控制器将数字信号与指纹库里的指纹进行匹配,匹配结果将通过液晶显示器显示出来。这就是光学式指纹识别的工作原理。
电容式与光学式指纹识别主要在指纹的采集方式上拥有较大差异,而在指纹的验证过程中则基本类似。然而因为电容式指纹识别拥有体积小、适用性广的优点,已经有越来越多的设备采用电容式指纹识别,未来的主流将是电容式指纹识别。
3 指纹识别算法实现
3.1 指纹识别算法流程

3.2 指纹图像预处理
- 1.图像归一化
- 2.图像分割
- 3.图像二值化
- 4.细化
几个步骤 当然有一些算法为了追求极致,中间还利用了增强、多重滤波等方式,但最根本的目的都是为了在细化之后保留指纹信息并且方便后续处理。
预处理之后是特征点的提取,也就是找到指纹图像当中有价值,具有唯一性和不变性的信息。主要特征点有端点、分叉点几类,在提取部分除了简单的遍历检索确认之外,还有比较重要的一步是伪特征点的去除,主要是针对图像不清晰、不完整导致的断点和边缘端点等。
最后一步是特征点的匹配,将指纹库中的指纹信息与提取的目标图像特征点进行对比。主流算法是以指纹中心点为依据,根据特征点所在的角度及距离,确认其所在位置,根据匹配度计算是否是同一手指的指纹。
3.3 指纹图像目标提取
指纹图像目标提取主要是将指纹图片中提取出来,也叫做指纹图像分割。
图片的前景通过观察可知是由条状或者圆形的一些组成,而底图其他部分只是一个均匀的底色而已。
我们使用非常简单的手段,基于局部梯度就可以很容易实现我们的目标。
方差梯度法提取指纹:
指纹图像通常由前景区域(包含有指纹的脊线和谷线)和背景区域这两部分组成。一般来说,在指纹图像的前景区域中,指纹的脊线和谷线的灰度差是较大的,因而其灰度统计特性局部灰度方差很大;而在指纹图像的背景区域中,两者的方差是很小的。基于这一特性,可以利用指纹图像的局部方差来进行分割。因此,这种方法也被称为方差梯度法。
的灰度平均值 M和方差 Var计算方法:

提取前的指纹图像:

提取后的指纹图像:

可以看到,学长做的还有些噪点,但是也很好解决,做一次形态学操作即可:

这样噪点就去除了。
3.4 指纹图像增强

3.5 指纹特征提取
人体指纹的特征可以反映在给定的人类群体里来自不同手指的指纹之间相似的程度。
指纹的特征信息很多,所有的这些指纹特征信息构成了庞大的指纹特征集合。
指纹的细节特征主要指的是纹线端点(RidgeEnding)和纹线分叉点(RidgeBifurcation)。
纹线端点指的是纹线突然结束的位置,而纹线分叉点则是指纹线一分为二的位置。
大量的统计结果表明,使用这两类特征点就足以描述指纹的唯一性。

Minutia Cylinder-Code (MCC) ,该算法是非常著名的指纹特征识提取算法,
第一次发表在:IEEE tPAMI
Minutia Cylinder-Code: a new representation and matching technique for
fingerprint recognition", IEEE tPAMI 2010
- MCC提出了一种基于三维数据结构的圆柱编码算法,其从细节的距离和角度出发,构造了圆柱编码
- 为一种多级的指纹匹配方法,其不仅使用了细节点特征也使用了方向场等特征
- 特征视为一种局部结构,也是3D结构

部分实现代码:
# Compute the cell coordinates of a generic local structure
# 计算
mcc_radius = 70
mcc_size = 16
g = 2 * mcc_radius / mcc_size
x = np.arange(mcc_size)*g - (mcc_size/2)*g + g/2
y = x[..., np.newaxis]
iy, ix = np.nonzero(x**2 + y**2 <= mcc_radius**2)
ref_cell_coords = np.column_stack((x[ix], x[iy]))mcc_sigma_s = 7.0mcc_tau_psi = 400.0mcc_mu_psi = 1e-2def Gs(t_sqr):"""Gaussian function with zero mean and mcc_sigma_s standard deviation, see eq. (7) in MCC paper"""return np.exp(-0.5 * t_sqr / (mcc_sigma_s**2)) / (math.tau**0.5 * mcc_sigma_s)def Psi(v):"""Sigmoid function that limits the contribution of dense minutiae clusters, see eq. (4)-(5) in MCC paper"""return 1. / (1. + np.exp(-mcc_tau_psi * (v - mcc_mu_psi)))
# n: number of minutiae
# c: number of cells in a local structure
xyd = np.array([(x,y,d) for x,y,_,d in valid_minutiae]) # matrix with all minutiae coordinates and directions (n x 3)# rot: n x 2 x 2 (rotation matrix for each minutia)d_cos, d_sin = np.cos(xyd[:,2]).reshape((-1,1,1)), np.sin(xyd[:,2]).reshape((-1,1,1))
rot = np.block([[d_cos, d_sin], [-d_sin, d_cos]])# rot@ref_cell_coords.T : n x 2 x c# xy : n x 2xy = xyd[:,:2]# cell_coords: n x c x 2 (cell coordinates for each local structure)cell_coords = np.transpose(rot@ref_cell_coords.T + xy[:,:,np.newaxis],[0,2,1])# cell_coords[:,:,np.newaxis,:] : n x c x 1 x 2# xy : (1 x 1) x n x 2# cell_coords[:,:,np.newaxis,:] - xy : n x c x n x 2# dists: n x c x n (for each cell of each local structure, the distance from all minutiae)dists = np.sum((cell_coords[:,:,np.newaxis,:] - xy)**2, -1)# cs : n x c x n (the spatial contribution of each minutia to each cell of each local structure)cs = Gs(dists)
diag_indices = np.arange(cs.shape[0])
cs[diag_indices,:,diag_indices] = 0 # remove the contribution of each minutia to its own cells# local_structures : n x c (cell values for each local structure)local_structures = Psi(np.sum(cs, -1))
3.6 指纹识别结果
提取特征后,剩下的任务就是对特征进行分类了,可以使用的算法就很多了,比如svm,决策树、神经网络,都可以

4 整体效果

5 最后
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate
相关文章:
竞赛选题 python opencv 深度学习 指纹识别算法实现
1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python opencv 深度学习 指纹识别算法实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:4分创新点:4分 该项目较为新颖…...
RK3568开发笔记(三):瑞芯微RK3588芯片介绍,入手开发板的核心板介绍
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139905873 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等多操作系统
版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正。 本文简单介绍如何将 igh 移植到 zephyr、freertos、rtems、rtthread等RTOS ,甚至 windows 上。 ##前言 目前࿰…...
ansible copy模块参选选项
copy模块用于将文件从ansible控制节点(管理主机)或者远程主机复制到远程主机上。其操作类似于scp(secure copy protocol)。 关键参数标红。 参数: src:(source:源) 要复制到远程…...
展厅设计主要的六大要素
1、从创意开始 展示设计的开始必须创意在先。根据整体的风格思路进行创意,首先要考虑的是主体的造型、大小高度位置以及它和周围展厅的关系。另外其他道具设计制作与运作方式也必须在创意中有明确的体现。 2、平面感 平面感是指对展示艺术设计平面图纸审美和功能两个…...
【数据结构与算法】最小生成树,Prim算法,Kruskal算法 详解
最小生成树的实际应用背景。 最节省经费的前提下,在n个城市之间建立通信联络网。 Kruskal算法(基于并查集) void init() {for (int i 1; i < n; i) {pre[i] i;} }ll root(ll a) {ll i a;while (pre[i] ! i) {i pre[i];}return i p…...
【启明智显产品分享】Model3工业级HMI芯片详解系列专题(三):安全、稳定、高防护
芯片作为电子设备的核心部件,,根据不同的应用领域被分为不同等级。工业级芯片适用于工业自动化、控制系统和仪器仪表等领域,对芯片的安全、稳定、防护能力等等有着较高的要求。这些芯片往往需要具备更宽的工业温度范围,能够在更恶…...
【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用
【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用 1、强引用(Strong Reference)2、软引用(Soft Reference)3、弱引用(Weak Reference)4、虚引用(Phantom Reference…...
对称/非对称加密
对称加密和非对称加密是两种主要的加密方式,用于保护数据的机密性和完整性。它们在密钥的使用和管理上有着显著的不同。 对称加密 原理 对称加密(Symmetric Encryption)使用相同的密钥进行加密和解密。这意味着发送方和接收方必须共享相同…...
DDei在线设计器-API-DDeiSheet
DDeiSheet DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。 DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。 一个DDeiFile实例至少包含一个DDeiSheet…...
随想录 Day 69 并查集 107. 寻找存在的路径
随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好 vector<int> father vector<int> (n, 0); // C里的一种数组结构// 并查集初始化 void init() {for (int i 0; i < n; i)…...
Hi3861 OpenHarmony嵌入式应用入门--LiteOS Mutex
CMSIS 2.0接口中的Mutex(互斥锁)是用于在多线程环境中保护共享资源的访问机制。Mutex(互斥锁)是一种特殊的信号量,用于确保同一时间只有一个线程可以访问特定的共享资源。 在嵌入式系统或多线程应用中,当多…...
使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集
文章目录 一、什么是“软件I2C”和“硬件I2C”1.1 什么是“软件I2C”1.2 什么是“硬件I2C” 二、软件I2C和硬件I2C2.1 软件模拟2.2硬件I2C 三、配置STM32CubeMX四、配置keil代码4.1 创建文件4.2 复制文件4.3 在keil中添加文件4.4 添加路径4.5 代码修改 五、硬件连接六、总结 一…...
Huffman树——AcWing 148. 合并果子
目录 Huffman树 定义 运用情况 注意事项 解题思路 AcWing 148. 合并果子 题目描述 运行代码 代码思路 其它代码 代码思路 Huffman树 定义 它是一种最优二叉树。通过构建带权路径长度最小的二叉树,经常用于数据压缩等领域。 运用情况 在数据压缩中&a…...
05 Pytorch 数据读取 + 二分类模型
05 Pytorch 数据读取 二分类模型05 Pytorch 数据读取 二分类模型05 Pytorch 数据读取 二分类模型 01 数据读取 DataLoader(set作为参数) 02 Dataset 从哪读,怎么读? 功能:数据从哪里读取? 如何读取…...
数据仓库之Kappa架构
Kappa架构是一种简化的数据处理架构,旨在处理实时数据流,解决传统Lambda架构中批处理和实时处理的复杂性。Kappa架构完全基于流处理,不区分批处理和实时处理,所有数据都是通过流处理系统进行处理。以下是对Kappa架构的详细介绍&am…...
ReactNative进阶(二十八)Metro
文章目录 一、前言二、Metro生命周期2.1 解析(Resolution)2.2 转换(Transformation)2.3 序列化(Serialization) 三、拓展阅读 一、前言 众所周知,Metro 是 React Native 默认的 JavaScript 打包模块。对于前端项目,打包工具已有webpack(大而全ÿ…...
python爬虫入门到精通路线
当谈及Python爬虫从入门到精通的路线时,我们可以将其分为几个关键阶段,每个阶段都有其特定的学习目标和内容。以下是一个清晰的路线规划: 1. 入门阶段 基础知识 学习Python的基础语法、数据类型、控制流等。了解基本的网络协议(…...
Java 笔记:常见正则使用
文章目录 Java 笔记:常见正则使用正则简介常用匹配年月日的时间匹配手机号码校验 参考文章 Java 笔记:常见正则使用 正则简介 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但…...
vue 2.0项目中使用tinymce富文本框遇到的问题
安装Tinymce 现在tinymce-vue最新版本是4.0,用的vue3.0的了,所以搭建的vue2.0项目要使用之前的版本 ( 安装指定版本 ). 首先安装tinymce的vue组件,因为没有注册服务 npm install tinymce/tinymce-vue2.0.0 -S接着安装tinymce: npm install…...
Proteus仿真PCA9685踩坑实录:示波器不显示PWM波?可能是I2C调试器惹的祸
Proteus仿真PCA9685实战避坑指南:从波形消失到高效调试 当你在Proteus中搭建好PCA9685电路,满心期待看到整齐的PWM波形时,示波器却一片空白——这种挫败感每个电子工程师都经历过。本文将带你深入Proteus仿真的底层逻辑,揭示I2C调…...
STM32CubeMX实战:5分钟搞定MAX31865 PT100测温,从SPI配置到温度读取全流程
STM32CubeMX实战:5分钟搞定MAX31865 PT100测温,从SPI配置到温度读取全流程 在工业测温领域,PT100凭借其优异的线性度和稳定性成为温度测量的黄金标准。而MAX31865作为专为RTD传感器设计的信号调理器,极大简化了前端电路设计。本文…...
深入TEA5767数据手册:51单片机I²C驱动FM收音模块的避坑指南与调试心得
深入解析TEA5767:51单片机驱动FM收音模块的实战技巧 在嵌入式开发领域,能够独立解读芯片手册并实现功能驱动是工程师的核心能力之一。TEA5767作为一款经典的FM收音芯片,因其低功耗、高集成度和简单的IC接口而广受欢迎。本文将从一个实际开发者…...
TVA 在宠物混合监护场景中的创新应用(4)
重磅预告:本专栏将独家连载新书《智能体视觉技术与应用》(系列丛书)部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。…...
5分钟快速上手:用Tinke免费工具轻松解包修改NDS游戏资源
5分钟快速上手:用Tinke免费工具轻松解包修改NDS游戏资源 【免费下载链接】tinke Viewer and editor for files of NDS games 项目地址: https://gitcode.com/gh_mirrors/ti/tinke 你是否曾经想过深入探索任天堂DS游戏的神秘世界?想要提取那些精美…...
别再只盯着PWM了!手把手教你为你的Arduino项目选择合适的DCDC调制方式(PFM/PWM/Burst Mode全解析)
别再只盯着PWM了!手把手教你为你的Arduino项目选择合适的DCDC调制方式(PFM/PWM/Burst Mode全解析) 当你为Arduino项目挑选电源模块时,是否曾被数据手册上PWM、PFM、Burst Mode这些术语搞得一头雾水?我曾在一个低功耗气…...
DIY蓝牙街机摇杆:从零打造无线复古游戏控制器
1. 项目概述与核心思路作为一个玩了二十多年街机,也折腾了十几年硬件的“老炮儿”,我始终觉得,有些东西的味道是数字模拟不出来的。比如,用键盘或现代手柄玩《拳皇97》或《合金弹头》,总觉得少了点灵魂——那“咔哒咔哒…...
Zephyr 启动流程:从复位向量到main()的完整旅程
1. 从复位向量开始的奇妙旅程 当你按下嵌入式设备的电源按钮时,芯片内部就开始了一场精心编排的启动芭蕾。对于使用Zephyr RTOS的系统来说,这个旅程从复位向量(Reset Vector)开始,就像火车从始发站出发一样。Cortex-M架…...
手把手教你用Zynq-7100 FPGA实现100Mbps OOK信号定时同步(含完整Verilog代码)
基于Zynq-7100的OOK信号定时同步实战:从算法到FPGA实现全解析 在无线通信系统中,定时同步是数字接收机设计中最关键的环节之一。当我们需要在Xilinx Zynq-7100 FPGA平台上实现100Mbps OOK信号的接收处理时,面临的最大挑战是如何在仅有50MHz外…...
AI Agents 越智能,企业的人类判断力需求反而会爆炸式增长:Jevons 悖论在企业落地中的隐形反弹
在企业全面拥抱 AI Agents 的当下,最容易被忽略的不是模型能力,而是“智能变便宜”之后带来的责任边界扩张。产品团队让 Agent 自动起草客户邮件、更新工单、标记流失风险、总结销售通话、推荐代码变更、升级支持问题、准备决策材料——每一步都变得前所…...
