指纹识别系统 (Fingerprint Recognition System)

返回项目列表
已发布
指纹识别系统 (Fingerprint Recognition System)

基于 C++/MFC 开发的指纹识别系统,实现指纹图像的预处理、特征提取、特征匹配与识别

C++
指纹识别系统 (Fingerprint Recognition System)

项目简介#

这是一个基于C++/MFC开发的指纹识别系统,实现了完整的指纹图像处理流程,包括图像预处理、特征提取、特征匹配和识别等功能。

功能模块#

图像处理流程(12个步骤)#

  1. 第1步:载入图像 - 加载指纹图像文件
  2. 第2步:中值滤波 - 去除图像噪声
  3. 第3步:均衡化 - 图像对比度增强
  4. 第4步:方向计算 - 计算指纹脊线方向
  5. 第5步:频率计算 - 计算指纹脊线频率
  6. 第6步:掩码计算 - 计算有效区域掩码
  7. 第7步:Gabor增强 - Gabor滤波器增强指纹图像
  8. 第8步:二值化 - 将图像转换为二值图像
  9. 第9步:细化 - 细化指纹脊线
  10. 第10步:特征提取 - 提取指纹特征点(端点和分叉点)
  11. 第11步:特征过滤 - 过滤伪特征点,生成特征模板
  12. 第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; // 两点距离
};

使用说明#

单步测试#

  1. 点击左侧”分布测试”区域的步骤按钮,可以单独测试每个处理步骤
  2. 处理结果会显示在中间的图像显示区域

特征登记#

  1. 在”登记人”输入框中输入姓名
  2. 点击”图像”区域的”登记”按钮,或点击”指纹采集器”区域的”登记”按钮
  3. 系统会自动执行完整的处理流程,并将特征保存到指纹库

特征识别#

  1. 点击”图像”区域的”识别”按钮,或点击”指纹采集器”区域的”识别”按钮
  2. 系统会自动执行完整的处理流程,并在指纹库中查找匹配的指纹
  3. 识别结果会显示在信息区域
  4. 使用采集器识别时:先点击“启动”连接采集器,手指放在采集器后点击“识别”,程序会先自动将当前图像保存为capt.bmp并校验文件可用,若未采集到图像会给出提示而不会再出现“内存不足”

指纹库管理#

  • 点击”指纹库信息”按钮可以查看指纹库中的记录
  • 指纹库数据保存在Database目录下

文件结构#

Finger/
├── FingerDlg.cpp # 主对话框实现文件,包含所有处理函数
├── FingerDlg.h # 主对话框头文件
├── Finger.cpp # 应用程序主文件
├── Finger.h # 应用程序头文件
├── Database/ # 指纹库目录
│ ├── index.txt # 指纹库索引文件
│ ├── *.bmp # 指纹图像文件
│ └── *.mdl # 特征模板文件
└── temp/ # 临时文件目录,保存各步骤的处理结果
├── Step1_Source.bmp
├── Step2_MidFilter.bmp
└── ...

注意事项#

  1. 内存管理

    • 所有动态分配的内存都需要正确释放
    • 释放MINUTIAE数组时,必须先释放每个元素的neibors内存
  2. 文件路径

    • 确保temp目录和Database目录存在
    • 文件路径使用相对路径,确保程序运行时能找到这些目录
  3. 特征匹配

    • 特征匹配需要构建相邻特征点关系,这会消耗一定的内存
    • 如果指纹库中记录较多,匹配过程可能需要较长时间

开发环境#

  • 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步特征匹配时出现”内存不足”的问题
Profile Image of the Author
Sakura
Hello, I'm Sakura.
公告
欢迎来到我的博客! 我是Sakura,祝你拥有美好的一天~
分类
标签
最新动态
站点统计
文章
21
分类
7
标签
35
总字数
85,101
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录