指纹识别系统 (Fingerprint Recognition System)
返回项目列表
项目简介
这是一个基于C++/MFC开发的指纹识别系统,实现了完整的指纹图像处理流程,包括图像预处理、特征提取、特征匹配和识别等功能。
功能模块
图像处理流程(12个步骤)
- 第1步:载入图像 - 加载指纹图像文件
- 第2步:中值滤波 - 去除图像噪声
- 第3步:均衡化 - 图像对比度增强
- 第4步:方向计算 - 计算指纹脊线方向
- 第5步:频率计算 - 计算指纹脊线频率
- 第6步:掩码计算 - 计算有效区域掩码
- 第7步:Gabor增强 - Gabor滤波器增强指纹图像
- 第8步:二值化 - 将图像转换为二值图像
- 第9步:细化 - 细化指纹脊线
- 第10步:特征提取 - 提取指纹特征点(端点和分叉点)
- 第11步:特征过滤 - 过滤伪特征点,生成特征模板
- 第12步:特征匹配/特征入库 - 特征匹配识别或特征入库
主要功能
- 指纹登记:将指纹特征保存到指纹库
- 指纹识别:从指纹库中识别匹配的指纹
- 单步测试:可以单独测试每个处理步骤
- 完整流程:一键执行所有处理步骤
数据结构说明
MINUTIAE(特征点结构)
struct MINUTIAE{ int x; // 横坐标(列坐标) int y; // 纵坐标(行坐标) int type; // 特征点类型(1-端点,3-分叉点) float theta; // 该点处的脊线方向(弧度) NEIGHBOR* neibors; // 相邻特征点序列(动态分配)};NEIGHBOR(相邻特征点结构)
struct NEIGHBOR{ int x; // 横坐标 int y; // 纵坐标 int type; // 特征点类型 float Theta; // 两点连线角度 float Theta2Ridge; // 两点脊线方向夹角 float ThetaThisNibor; // 相邻特征点的脊线方向 int distance; // 两点距离};使用说明
单步测试
- 点击左侧”分布测试”区域的步骤按钮,可以单独测试每个处理步骤
- 处理结果会显示在中间的图像显示区域
特征登记
- 在”登记人”输入框中输入姓名
- 点击”图像”区域的”登记”按钮,或点击”指纹采集器”区域的”登记”按钮
- 系统会自动执行完整的处理流程,并将特征保存到指纹库
特征识别
- 点击”图像”区域的”识别”按钮,或点击”指纹采集器”区域的”识别”按钮
- 系统会自动执行完整的处理流程,并在指纹库中查找匹配的指纹
- 识别结果会显示在信息区域
- 使用采集器识别时:先点击“启动”连接采集器,手指放在采集器后点击“识别”,程序会先自动将当前图像保存为
capt.bmp并校验文件可用,若未采集到图像会给出提示而不会再出现“内存不足”
指纹库管理
- 点击”指纹库信息”按钮可以查看指纹库中的记录
- 指纹库数据保存在
Database目录下
文件结构
Finger/├── FingerDlg.cpp # 主对话框实现文件,包含所有处理函数├── FingerDlg.h # 主对话框头文件├── Finger.cpp # 应用程序主文件├── Finger.h # 应用程序头文件├── Database/ # 指纹库目录│ ├── index.txt # 指纹库索引文件│ ├── *.bmp # 指纹图像文件│ └── *.mdl # 特征模板文件└── temp/ # 临时文件目录,保存各步骤的处理结果 ├── Step1_Source.bmp ├── Step2_MidFilter.bmp └── ...注意事项
-
内存管理:
- 所有动态分配的内存都需要正确释放
- 释放
MINUTIAE数组时,必须先释放每个元素的neibors内存
-
文件路径:
- 确保
temp目录和Database目录存在 - 文件路径使用相对路径,确保程序运行时能找到这些目录
- 确保
-
特征匹配:
- 特征匹配需要构建相邻特征点关系,这会消耗一定的内存
- 如果指纹库中记录较多,匹配过程可能需要较长时间
开发环境
- Visual Studio(MFC项目)
- Windows操作系统
- C++语言
更新日志
2025年 - 采集器识别内存不足修复
- 问题:点击采集器区域的“识别”时,如果没有成功保存采集到的指纹图像,后续处理会在读取空文件时使用未初始化的宽高,导致内存分配异常并弹出“内存不足”。
- 修复:
OnBnClickedBtnIdentify在识别前强制从采集器保存当前图像到capt.bmp,并校验文件是否存在;未获取到图像时直接提示用户。Identify函数增加图像存在性和参数校验(宽、高、位深必须有效且为8位),读取失败时提前返回友好错误,避免内存异常。
2024年 - 内存泄漏和图像显示错误修复
第二次修复 - 图像显示断言错误
- 问题:点击”第12步:特征匹配”时出现”Debug Assertion Failed!”错误,断言
m_hBitmap != 0失败 - 原因:
ShowImageInCtrl函数没有检查图像文件是否加载成功,当文件不存在或损坏时,尝试访问无效的位图句柄导致断言失败 - 修复:
- 在
ShowImageInCtrl函数中添加图像加载成功检查 - 如果图像加载失败,清空显示区域并返回错误代码,而不是继续访问无效的位图
- 在
Step12_Match函数中添加文件存在性检查,确保源文件存在后再复制
- 在
第一次修复 - 内存泄漏问题
- 修复了
BuildNabors函数的内存泄漏问题 - 完善了所有特征匹配相关函数的内存释放逻辑
- 优化了
MinuSimilarity函数,当自己和自己匹配时只构建一次相邻关系 - 添加了
ReadMinutiae返回值检查和特征点数量合理性验证 - 修复了第11步特征过滤中
memset的参数错误 - 解决了第12步特征匹配时出现”内存不足”的问题














