河南大学指纹识别C#实现
这是我第一个比较自己写的比较成功的应用。创新实践选的是赵建辉老师的指纹识别。基于zk4500指纹识别仪的开发,教材给出了C++实现的实例,可能是VS版本的原因,我照着书上敲的代码一模一样都能报错,也是醉了。所以我改用比较熟悉的C#开发。只是成品功能均已经实现,只是界面还有一些细节仍有很大的改进空间。我想分享一下开发中遇到的问题,急于寻找源码的同学可以直接跳过,我会在文末附上百度网盘链接。
这是老师所给资源的目录:

其中,Sample文件夹下是实例程序,包括C

实时显示指纹图像

第一个问题:如何实现连接指纹仪使界面实时显示采集到的指纹图像主要是调用开发文档
4.1.9 sensorCapture
[函数]
int __stdcall sensorCapture(HANDLE handle, unsigned char
*imageBuffer, int imageBufferSize)
[功能]
从指纹采集器中采集图像
[参数说明]
handle
[in] sensorOpen 返回的句柄
imageBuffer
[in,out] 返 回 采 集 到 的 图 像 , 申 请 空 间 大 小 调 用
sensorGetParameter(106)
imageBufferSize
[in] imageBuffer 申请空间的大小
[返回值]

0 采集到图像的大小
0 没有采集到图像
-2 handle 或 imageBuffer 为空
-3 申请空间大小小于采集到图像空间大小

Sample C#示例下已经有相关实现。我是拷贝过来的。只是出现了问题,原因在于,所给示例是winForm,我用的是WPF。
winForm相关代码如下:

Thread captureThread = new Thread(new ThreadStart(DoCapture));captureThread.IsBackground = true;captureThread.Start();g_bIsTimeToDie = false;

DoCapture:

  private void DoCapture(){while (!g_bIsTimeToDie){int ret = ZKFPCap.sensorCapture(g_Handle, g_FPBuffer, g_FPBufferSize);if (ret > 0){SendMessage(g_FormHandle, MESSAGE_FP_RECEIVED, IntPtr.Zero, IntPtr.Zero);}}}

指纹图像显示

    protected override void DefWndProc(ref Message m){switch (m.Msg){case MESSAGE_FP_RECEIVED:{try{//可以借鉴MemoryStream ms = new MemoryStream();BitmapFormat.GetBitmap(g_FPBuffer, g_nWidth, g_nHeight, ref ms);Bitmap bmp = new Bitmap(ms);this.picFP.Image = bmp;//可以借鉴txtStatus.Text = "IMAGE_READY";int ret = 0;int id = 0;int score = 0; int quality = 0;if (g_IsRegister){Array.Clear(g_RegTmp, 0, g_RegTmp.Length);ret = ZKFinger10.BIOKEY_EXTRACT(g_biokeyHandle, g_FPBuffer, g_RegTmp, 0);if (ret > 0){                                  Array.Copy(g_RegTmp, g_RegTmps[g_RegisterTimeCount++], ret);                       // Get fingerprint qualityquality = ZKFinger10.BIOKEY_GETLASTQUALITY();txtQuality.Text = quality.ToString();txtPrompt.Text = string.Format("Still press finger {0} time", REGISTER_FINGER_COUNT - g_RegisterTimeCount);if (g_RegisterTimeCount == REGISTER_FINGER_COUNT){Array.Clear(g_RegTmp, 0, g_RegTmp.Length);int size = 0;/*unsafe{fixed (byte* Template1 = g_RegTmps[0]){fixed (byte* Template2 = g_RegTmps[1]){fixed (byte* Template3 = g_RegTmps[2]){byte*[] pTemplate = new byte*[3] { Template1, Template2, Template3 };size = ZKFinger10.BIOKEY_GENTEMPLATE(g_biokeyHandle, pTemplate, 3, g_RegTmp);}}}}*/size = ZKFinger10.BIOKEY_GENTEMPLATE_SP(g_biokeyHandle, g_RegTmps[0], g_RegTmps[1], g_RegTmps[2], 3, g_RegTmp);if (size > 0){ZKFinger10.BIOKEY_DB_ADD(g_biokeyHandle, ++g_RegisterCount, size, g_RegTmp);txtPrompt.Text = string.Format("Register succeeded, fid={0}, totalCount={1}", g_RegisterCount, ZKFinger10.BIOKEY_DB_COUNT(g_biokeyHandle));g_IsRegister = false;}else{txtPrompt.Text = "Register failed";}g_RegisterTimeCount = 0;}}else{txtPrompt.Text = "Extract template failed";}}else{Array.Clear(g_VerTmp, 0, g_VerTmp.Length);   if ((ret = ZKFinger10.BIOKEY_EXTRACT(g_biokeyHandle, g_FPBuffer, g_VerTmp, 0)) > 0){// Get fingerprint qualityquality = ZKFinger10.BIOKEY_GETLASTQUALITY();txtQuality.Text = quality.ToString();ret = ZKFinger10.BIOKEY_IDENTIFYTEMP(g_biokeyHandle, g_VerTmp, ref id, ref score);if (ret > 0){txtPrompt.Text = string.Format("Identification success, id={0}, score={1}", id, score);}else{txtPrompt.Text = string.Format("Identification failed, score={0}", score);}}else{txtPrompt.Text = "Extract template failed";                                  }}}catch (Exception ex){MessageBox.Show(ex.Message.ToString());}}break;default:base.DefWndProc(ref m); break;}}

Windows中的Message参见博文:https://www.cnblogs.com/ltt1987/archive/2006/06/01/414868.html
照搬进WPF是行不通的。因此我对DoCaputre做了相应的修改:

  private void DoCapture(){while (!g_bIsTimeToDie){int ret = ZKFPCap.sensorCapture(g_Handle, g_FPBuffer, g_FPBufferSize);if (ret > 0){//SendMessage(g_FormHandle, MESSAGE_FP_RECEIVED, IntPtr.Zero, IntPtr.Zero);MemoryStream ms = new MemoryStream();BitmapFormat.GetBitmap(g_FPBuffer, g_nWidth, g_nHeight, ref ms);Bitmap bt = new Bitmap(ms);ShowImg(bt);// pic1.Image = bmp;}}}

ShowImage:

   private void ShowImg(Bitmap bt){//.Net框架下不允许一个线程中直接访问另一个线程的控件,因此下一行的写法是错误的,运行会出问题//img1.Source = ImageTranslater.BitmapToBitmapImage(bt);img1.Dispatcher.Invoke(() =>{img1.Source = ImageTranslater.BitmapToBitmapImage(bt);});}

ImageTranslater.BitmapToBitmapImage(Bitmap bt):实现Bitmap->BitmapImage;由于我用的是WPF的Image控件,因此需要这一步转换。

指纹信息入库

将采集到的指纹信息存入数据库中。
所建数据库如图

其中,Name->被采集人姓名
Age->被采集人年龄
Grade–>被采集人年级
PBuffer ->被采集人图像数据(字节数组)

相关代码:

 case "指纹登记":StateChange(false);if (textBox_Grade.Text == null || textBox_Name.Text == null || textBox_Sno.Text == null || textBox_Grade.Text == "" || textBox_Name.Text == "" || textBox_Sno.Text == ""){MessageBox.Show("内容不能为空,请重新填写!");}else{FingerDatas fd = new FingerDatas();fd.Name = textBox_Name.Text;fd.Sno = textBox_Sno.Text;fd.Grade = textBox_Grade.Text;fd.PBuffer = g_FPBuffer;using (FingerDataEntities context = new FingerDataEntities()){try{context.FingerDatas.Add(fd);context.SaveChanges();MessageBox.Show("保存成功");}catch (Exception ex){MessageBox.Show("数据保存失败,发生错误:" + ex.Message);}}}textBox_Grade.Clear();textBox_Name.Clear();textBox_Sno.Clear();img2.Source = null;break;

指纹识别

主要是算法库的两个算法:
根据指纹图像生成模板的算法:
4.2.6 BIOKEY_EXTRACT
[函数]
int __stdcall BIOKEY_EXTRACT(HANDLE handle, BYTE*
PixelsBuffer, BYTE *Template, int PurposeMode)
[功能]
从指纹图像中提取指纹模板
[参数说明] handle
[in] BIOKEY_INIT 返回的句柄
PixelsBuffer
[in] 采集到的指纹图像
Template
[in,out] 返回提取的指纹模板
PurposeMode
[in] 保留,默认为 1 [返回值]

0 提取的指纹模板长度
0 失败

根据模板进行指纹的匹配:
4.2.17 BIOKEY_VERIFY
[函数]
int __stdcall BIOKEY_VERIFY(HANDLE handle, BYTE
*Template1, BYTE *Template2)
[功能]
两个模板进行 1:1 比对
[参数说明] handle
[in] BIOKEY_INIT 返回的句柄
Template1
[in] 待比对的指纹模板
Template2
[in] 待比对的指纹模板
[返回值]

0 1:1 比对的分数
0 比对失败

实现代码:

   case "指纹识别":StateChange(true);byte[] newFinger = g_FPBuffer;byte[] newFingerModel = new byte[2048];string resultStr;using (FingerDataEntities context = new FingerDataEntities()){try{var q1 = from t in context.FingerDatasselect new {t.Name,t.Sno,t.Grade,t.PBuffer} ;if (q1.Equals(null)){MessageBox.Show("数据库不包含任何指纹信息,请录入指纹信息!" );break;}else{int match = 0;int result_extract = ZKFinger10.BIOKEY_EXTRACT(g_biokeyHandle, newFinger, newFingerModel, 0);if (result_extract > 0){foreach(var q in q1){byte[] q_FingerModel = new byte[2048];byte[] q_Finger = q.PBuffer;ZKFinger10.BIOKEY_EXTRACT(g_biokeyHandle, q_Finger, q_FingerModel, 0);match = ZKFinger10.BIOKEY_VERIFY(g_biokeyHandle, newFingerModel, q_FingerModel);if (match > 0){resultStr = string.Format("识别成功,匹配到的指纹信息为:\n 姓名:{0}\n 学号:{1} \n 年级:{2}  \n 相似度:{3}%", q.Name, q.Sno, q.Grade, match);MemoryStream ms = new MemoryStream();BitmapFormat.GetBitmap(q_Finger, g_nWidth, g_nHeight, ref ms);Bitmap bt = new Bitmap(ms);BitmapImage bi = ImageTranslater.BitmapToBitmapImage(bt);img2.Source = bi;MessageBox.Show(resultStr);break;}}if (match == 0){resultStr = "数据库中未找到与之相似的指纹信息,请录入信息后再次尝试";MessageBox.Show(resultStr);}}else{MessageBox.Show("出现意外");break;}}}catch (Exception ex){MessageBox.Show("发生错误:" + ex.Message);}}break;

尾声

本来打算用C#将书上的图像处理算法一一实现,无奈处理的结果太差劲,最后只能取巧,调用现成的算法库。虽然没能自己实现算法,在这个过程中,自己学到了许多东西,多少也算有所收获。最后,放上百度网盘链接,需要的同学可以自行下载。
链接:https://pan.baidu.com/s/1tHjfpaj5bY0mTtxFKeYGEA
提取码:1123
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V1的分享

基于zk4500的指纹识别C#实现相关推荐

  1. matlab 函数return_基于MATLAB的指纹识别系统【论文,GUI】

    一.课题介绍 本设计为基于MATLAB的指纹识别系统.本设计系统主要对指纹图像进行三方面处理:图像预处理.特征提取和特征匹配.图像预处理包括四个步骤:图像灰度化.滤波增强.二值化.细化,对指纹图像进行 ...

  2. matlab 二值化_基于MATLAB的指纹识别系统[GUI界面+万字技术文档+语音播报]

    一.课题介绍 本设计为基于MATLAB的指纹识别系统.本设计系统主要对指纹图像进行三方面处理:图像预处理.特征提取和特征匹配.图像预处理包括四个步骤:图像灰度化.滤波增强.二值化.细化,对指纹图像进行 ...

  3. matlab 指纹,一种基于matlab的指纹识别方法

    一种基于matlab的指纹识别方法 [技术领域] [0001 ] 本发明涉及指纹识别领域,特别涉及一种基于MTLAB的指纹识别方法. [背景技术] [0002] 传统的安防系统主要采用基于令牌或密码的 ...

  4. 基于matlab的指纹识别程序

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 基于matlab的指纹识别程序 前言 一.程序思路是什么? 二.预处理步骤 1.指纹图像的灰度化处理 2.指纹图像的归一化与分割处理 ...

  5. 基于matlab指纹识别论文,毕业论文-基于Matlab的指纹识别

    毕业论文-基于Matlab的指纹识别 1 毕 业 论 文 基于 Matlab 的指纹识别 姓 名 院(系) 专业班级 学 号 指导教师 职 称 论文答辩日期 2 摘摘 要要 随着科学技术的不断发展,自 ...

  6. 【毕业设计】基于单片机的指纹识别门禁系统设计 -物联网 stm32 嵌入式

    文章目录 1 简介 2 绪论 2.1 课题背景 2.2 项目内容 3 系统设计 3.1 系统架构 3.2 硬件设计 3.3 指纹识别模块的程序设计 3.3.1 指纹录入 3.3.2 指纹识别代码流程 ...

  7. 基于ARM的指纹识别门禁系统设计方案

    现代社会高速发展,很多场合需要身份确认,传统的身份识别技术已经不能满足社会要求.人的身体特征具有不可复制性,因此人们开始研究生物识别技术,而指纹具有唯一性.终生不变性.难于伪造等特点,安全性高,因而得 ...

  8. arm linux 指纹识别,基于ARM—Linux指纹识别系统的设计.pdf

    基于ARM-Linux指纹识别系统的设计.pdf 第 20卷 第 l5期 电子设计工程 2012年 8月 Vo1.20 No.15 ElectronicDesienEn~inee Aug.2012 基 ...

  9. 基于STM32的指纹识别智能锁设计

    本设计是基于stm32的指纹识别智能锁设计,主要实现以下功能: 1,OLED显示输入锁的状态,解锁状态,开锁成功,开锁失败,确定,清除 2,通过矩阵键盘输入开门密码.修改密码.确认密码等操作: 3,可 ...

  10. 基于FPGA的指纹识别(使用AS608模块)

    项目介绍 硬件平台:正点原子新起点FPGA开发板或小脚丫MAX10 FPGA开发板.AS608指纹识别模块 软件平台:Quartusii13.1 功能定义 详细要求 key1:添加一个指纹 Key2: ...

最新文章

  1. docker 删除容器_Docker使用命令和技巧
  2. CloudCompare 的简单的使用说明
  3. 宏基ec471g黑苹果_宏碁acer ec-471g 黑苹果配置教程
  4. YTU 1495 蛇行矩阵 YTU 1607 字符棱形YTU 1959 图案打印YTU 2016 打印金字塔
  5. 时间日期类JAVA包含地区属性_Java常用类 | 时间和日期类
  6. 大并发下程序出错_Python并发编程理论篇
  7. CentOS7 正确安装mysql(亲测)
  8. android的控件常用方法是,Android常用控件属性分析
  9. C/C++网络编程工作笔记0001---网络编程的基本概念
  10. [Angular 2] Using events and refs
  11. C++构造函数异常(二)
  12. C#生成dll, VS或unity调用
  13. 安装Scrapy失败的解决方法
  14. JavaScript跨域请求
  15. 《中国近代史纲要》考试过关?Python帮你划重点
  16. 文件hidsdi.h
  17. a pubhub service
  18. Java实现 LeetCode 493 翻转对
  19. mysql导入wps_WpS数据数据库导入
  20. JS中的深拷贝与浅拷贝

热门文章

  1. [翻译+分析总结] nnU-Net for Brain Tumor Segmentation
  2. Java程序员年薪40W是什么水平?税前还是税后?
  3. 应用计算机测线性电阻伏安特性曲线,伏安特性曲线
  4. 外地户籍应届毕业生落户上海申请及办理流程(包括海外)
  5. (C++)统计字符_给定一个英文字符串,请写一段代码找出这个字符串中首先出现三次的那个英文字符
  6. STM32单片机基础知识总结(二)
  7. Python--绘制点
  8. 如何利用SPSS软件进行数据的描述性分析
  9. Git 使用源代码包编译、配置部署和使用 使用包管理工具安装
  10. ubuntu 16.04下设置静态IP地址