目录
摘要
随着经济时代的到来和科技的发展,人们对生活水平有了更进一步的的追求,对生活的安全性逐渐提高,其中具有身份安全认证功能的指纹识别技术在人们的关注和需求下,得到了长足的发展,出现了各种不同的指纹识别系统,然而大多数指纹识别系统是基于PC机的,在便捷性和可移动性上还存在很多不足。基于嵌入式的指纹识别成为了人们的研究的方向,并取得了一定的成果。然而在这些应用中还有很多不足等待大家的讨论研发,需要更进一步的研究和改善,以提高系统的应用前景。本文通过对嵌入式相关知识、图像预处理等方面的理论知识进行研究,在前人的基础之上,开发了一套小型的嵌入式身份识别系统。本文根据要设计的身份识别系统的功能来讨论了相关的指纹识别系统的硬件设计,完成了基于STM32微处理器的指纹识别系统设备的硬件电路设计和相应的软件设计。该系统具有指纹图像采集、指纹库中数目统计、指纹比对、指纹录入等功能。另外,本文电路设计中选取的电器件在价格和性能上都有一定的优势。同时,本文对指纹识别系统的过程和相关的原理进行了一定的分析和研究,重点研究指纹图像的预处理过程。
关键词:指纹识别; STM32; 嵌入式技术;图像预处理
第1章绪论
1.1引言
随着社会的进步和经济的发展,人们越来越关注身份鉴别的准确性和安全性。指纹识别就是根据生物特征的身份认证方式之一[1]。传统的身份识别方法的局限性和弊端表现得越来越明显。从本质上解决传统了身份识不足,因此正逐渐被认可。指纹识别技术发展至今已经成为生物特征识别应用最为可靠,方便的一种类型。本研究设计,是一种基于STM32芯片的指纹识别系统,它是通过指纹算法处理,以及传感器采集指纹数据等来实现指纹识别的。同时它还结合了VC++实现了人机交换显示指纹分辨数据。鉴于STM32有以下几点功能高速低功耗,这个特点可以让我们将其作为主控芯片。嵌入式指纹识别系统有较高的实时性、准确性安全性等各个实验的来以要求进行了改进,以提高指纹识别系统的性能[2]。
1.2指纹识别技术
指纹识别技术是指利用计算机进行的指纹自动识别的技术,它是一项综合技术,其研究发展涉及到多个前沿及边缘科学,如模糊数学、数学形态学、神经网络、模式识别、计算机视觉、人工智能、数据压缩、并行处理以及网络技术。基本可以分为三类;捺印指纹、模糊指纹和活体指纹。捺印指纹指的是将沾了印墨的手指按压在某种东西(通常是纸)上所留下的指纹痕迹,过去通常采用的都是这种采集方式,直到今天,这种方式仍然是指纹采集的主要手段之一。模糊指纹一般是指犯罪现场采集观察到的指纹。根据录入原理的不同,活体指纹录入可以分为光反射式、超声反射式、热敏式以及电容式几种。根据采集时指头是否与录入仪器接触,又可分为接触式和非接触式。根据是否可以滚动采集指纹又可分为滚动指纹录入仪和非滚动指纹录入仪[3]。
1.3指纹识别研究的现状
指纹自动识别系统是网络、光电技术、图像处理、智能卡、数据库技术等于一体的综合技术。并把它变成计算机处理过的暗码相比对的代码。这些代码经过加密处理,然后经独特的相关算法进行识别判断,在算法上采用一个指纹的全部图案,而有的采用指纹的特殊细节的方法。
第2章STM32嵌入式指纹识别系统的设计
2.1设计的概述
指纹识别系统实际上是一个相当复杂的多任务系统,整个过程包括图像采集、预处理、特征提取、识别匹配等,考虑到实际应用的需要,还必须加上数据传输、外围设备控制等部分来完成一系列诸如人机对话、指纹数据库数据读取、匹配结果输出等工作。其中预处理、特征提取和匹配识别都具有算法复杂、计算量大的特点,因此整个系统实际上也是一个计算密集的过程。要实现这样一个多任务、高计算密度的系统,除了要求处理器拥有强大的计算能力外还必须拥有强大的控制能力来协调调度和分配资源。同时,大量高速的存储器资源也是必不可少的。
在这种系统中,由于微处理器既要完成复杂的图像处理,又要负责监控外围设备的任务,这样使得系统处理指纹的效率偏低,系统的功能简单,并且更重要的是对于系统升级或功能扩展都十分不便。在本嵌入式指纹自动识别系统中,我们将其分为指纹识别算法模块加控制模块两大部分。指纹图像预处理可得到具有清晰纹理结构的指 纹灰度图像,包括图像特征分割,图像收敛、平滑、增 强、二值化等一系列过程。
2.1.1图像分割
指纹图像应用部分梯度场值高,在很大程度上背景部分梯度场值低,所以,可以以分型维数的物理模型为基础通过梯度场来分割指纹图像。在这里我们可以通过一些计算方法来实现图像的分割[4]。
本分割方法构造边界曲线概率密度模型,接着根据指纹图像所具有的内在特征构造外背景区域概率密度函数和内指纹区域概率密度函数,然后形成边界曲线的Markov链,最后采用马尔科夫链蒙特卡洛模拟(MCMC)方法实现动态模拟,求取最优的边界曲线,从而实现对指纹图像的有效分割。指纹图像中存在有脊线区域、谷线区域和背景区域。相对而言,脊线区域上的像素的灰度值相差很小,而谷线区域与背景区域上的像素的灰度值相差很小。反映在灰度直方图上,灰度值就会在两处集中而形成两个峰,两个峰对应的灰度值分别称之为脊线中心灰度和谷线中心灰度。那么,可以认为脊线区域中像素的灰值服从以脊线中心灰度为中心的正态分布。然而对于指纹区而言,其上的像素既可能在脊线区域上,也可能在谷线区域上,而谷线的灰度分布跟背景灰度分布相同。因此判断曲线Γ内部区域在指纹区的指标应该是属于脊线区域的像素。在一块指纹区上,脊线和谷线总是交替出现,可以认为,脊线像素总数与谷线像素部数大致也相等。换句话说,脊线像素的总数应该大概等于指纹区像素的总数的1/2,太大或太小都不行。
2.1.2指纹图像的收敛
当受到外界的噪声干扰时,指纹纹线像素的位置和灰度会改变并发散。指纹图像的收敛就是使像素的变化差异缩小到预先固定的阈值之内。二维高斯函数描数值,A是该点的发散振幅(用灰度值表示),最后一项是二维高斯函数模板算子。
2.1.3指纹图像的二值化处理
指纹图像二值化处理把指纹图像变成黑白两色的指纹纹线结构。如果一个点的切向灰度之和比法向灰度之和要小,则可判断为黑点处在指纹纹路的背景上。
所谓灰度图象的二值化就是通过设定阀值,把它变为仅用两个灰度值分别表示图象的前景和背景颜色的二值图象。图象的二值化可以根据下面的阀值来处理。
2.1.4指纹图像的细化
指纹图像的细化是为了减少要处理的信息量,把 指纹的脊线部分对称减薄,使指纹纹线由原来的多个 像素宽度变为单个像素的线形图。 本研究采用查表法对指纹进行细化处理。因指纹 图像已进行二值化处理,其像素要么是 0,要么是 和方向差,再分析其内在的关系,从而建立局部的特 征向量以进行指纹特征点的初次匹配。同时在匹配的 过程中标记最大且不为零的匹配分数 Score,再 对所得匹配分数 Score 求和并经过进一步算法得到相 对匹配分数 S,为了减少误判,本研究通过设置门限 对指纹的匹配情况进行初步判定。 全局匹配:对于没有得到判定的情况,通过全局 匹配来进行进一步判定。由于前文已经求取了指纹的 奇异点,这里将提取的指纹 A 和指纹 B 的奇异点(中 心点或三角点)分别作为待判定和模板库指纹图像相 应的极坐标的中心点。
2.1.5指纹图像增强
指纹图像增强是指纹识别系统的重要组成部分, 在通过算法使指纹不清晰的地方得到改善的同时尽 量保留指纹原有的特征信息,确保后续图像处理的准 确性和可靠性。 对于指纹图像的增强,本研究前面通过计算获得 指纹的方向场和频率场信息,这里采用较成熟可靠的 Gabor 小波滤波器实现图像的智能增强,该小波工具 一方面在指纹纹线上可以对在该位置方向场上的指 纹纹线进行收敛增强,另一方面它也符合指纹纹线相 间的特点,可以在该位置的频率场上对指纹纹线进行 振荡增强,从而提高图像的增强效果,以便更有利地 提取指纹特征点信息[5]。
2.1.6特征点的提取
特征点提取分两种情况,即:对端点和交叉点的提取;对指纹特征奇异点的提取。本次的研究采用的是交叉数的特征提取方法。在特征点检测中,对 Harris 算子提出了两种不同的方法,添加了高斯函数一阶微 分作为滤波窗口,此窗口是可以手动调节的,进行了改进,得到了比传统的使用梯度算子进行检测更好的结 果。随着图像处理精度要求的不断提高,对图像边缘检测的精度要求也在不断提高,现 有的边缘特征检测算子大多都是像素级的方法来实现的。
2.2指纹传感器的分类
指纹采集设备按指纹传感器工作原理的不同可分为五类:光电式、电容式、压敏式、热敏式和超声波式。下面就指纹传感器的几种类型分别加以介绍。
2.2.1光电式指纹传感器
光电式指纹传感器工作原理是利用从光源发出的一组光线,经过棱镜后照射在待采手指上,由于指纹的脊和谷对光线的反射不同,所形成的指纹纹路图像被投射到半导体光敏矩阵器件上,形成随图像明暗变化而改变的电信号。最后经过A/D转换电路转换为一连串指纹识别系统设计的数字图像信息。早期的光电式指纹传感器中,光电图像转换器件主要采用半导体CCD器件,其信号输出大多是模拟信号,与处理器的接口电路比较复杂,抗干扰能力也较弱。随着CMOS数码阵列光电图像传感器技术的不断成熟,在光电图像转换的领域中,CMOS光电器件开始逐步取代传统的CCD光电器件。用CMOS光电器件取代CCD光电器件而构成的光电式指纹传感器,称之为CMOS光电式指纹传感器。光电式指纹传感器的优势在于,产品的成本相对较低,耐用度好,抗静电强度高,能承受一定程度的温度变化,并能够提供分辨率为500dpi的图像。不足之处主要表现在尺寸过大和潜在指印两个方面。
2.2.2热敏指纹传感器
热敏式指纹传感器的采样原理是通过感应在传感器上指纹的脊和谷的温度不同来获得指纹图像。热敏式指纹传感器的工作方式属于被动扫描型,输出信号为图像帧序列,需要用专门的图像拼接算法来拼接出一蝠完整的指纹图像。其特点是体积小,成本极低。但其输出的图像经拼接后生成的指纹图像几何失真度较大。热敏式指纹传感器采用了全新的设计思路,它的工作机理是基于对温度的敏感。从而可以在不影响芯片采集性能的前提下,在其表面涂覆一层导电的钛膜,既起到静电保护的作用,又可以提高芯片的耐瘩损性能。它的采集面通常呈窄条线状结构,采集时改变了以往传统的“捺印”模式[6]。依靠手指在指纹传感器表面上滑动时,各对应热敏传感单元上温度的不同变化来生成指纹图像的电信号。
2.2.3电容式指纹传感器
电容式指纹传感器由半导体晶片构成,在半导体晶片的表面,集成了约100,000个电容传感器阵列,其表面是绝缘的。当活体手指放在上面时,皮肤组成了电容阵列,手指上导电性能良好的真皮层上的脊和谷相对晶片表面的距离不同,与芯片之间产生不同的电容使电容传感器阵列中相应单元的电压值也不同,继而使这些电信号转换成一个8bit的灰度数字指纹图像。半导体电容式指纹传感器具有自动增益(AGC)功能,在不同的环境下结合反馈的信息,可以自动调节行列、局部范围以及每一个像素的灵敏度,从而提高图像的质量。例如一个局部不清晰(对比度差)的干燥指纹图像,或者是手指按压力度较轻而使边沿模糊不清,都能够被反馈环路感觉到,并自动增强其灵敏度来进行补偿,在图像捕捉的瞬间生成清晰的图像。因此采用半导体电容式指纹传感器录入设备,能够在相对较差的条件下生成质量较好的指纹图像。对不同的气候变化和职业背景所带来的手指变化,具有较好的适应性。半导体电容式传感器体积小巧,它可以集成到许多现有设备特别是移动式设备中,图像几何失真度小,能够生成质量较好的指纹图像,并且指纹录入时不需要较大面积的录入头。其缺点是受半导体大规模集成电路制造技术水平的限制,其采集的面积不易做大。对特别潮湿的手指,采集效果不佳。另外,容易受到静电的影响,这使得传感器有时会取不到图像,甚至会被损坏。
2.2.4超声波指纹传感器
超声波指纹传感器取像的原理是通过超声波扫描指纹的表面,接收其反射信号,测量它的变化值,得到脊的深度和具体位置,进而获得指纹图像。该类传感器工作时,超声波能够穿透台板以及指纹上的灰尘和残余物,所以积累在皮肤上的脏物和油脂对超声波扫描获得的图像影响不大,因此这样的图像是实际脊线凹凸的真实反映。其优点是采集面积大、适应能力好。缺点是设备体积大、成本高以及使用寿命不稳定。
2.2.5压敏指纹传感器
压敏指纹传感器顶层的表面是具有弹性的压敏介质材料,它们根据指纹的外表脊纹线的凹凸转化为相应的电子信号,继而形成指纹图像。其主要特点是成本较低,对干湿手指适应能力极佳,即使将其浸入水中,也不会影响指纹图像采集质量。缺点是对于妇女、儿童等皮肤较娇嫩的手指,采集的图像不够清晰。
2.3指纹采集程序设计
程序设计关键是程序实现SPI通信模式下STM32和指纹传感器FPS200的通信操作。FPS200 有 19 个寄存器,用来控制指纹数据采集 过程中的状态和行为,这里介绍几个比较重要的寄存 器的初始化:(1)初始化 CTRLB,使能芯片的ENABLE 位使其 处于工作状态,XTALSE 位选择内部 12 M 晶振,同时 使能指纹自动检测,通过判断 RDY 位的状态决定指 纹图像数据的读取。(2) 初 始 CTRLA, 这 里 可 以 选 择 GETROW、GETIMG 和 GETSUB 这 3 种存取模式的 1 种作为存 取模式,本研究给CTRLA 写入 0x02,即选择 GETIMG 模式来获取整幅图像。(3)初始化DTR、DCR 和 PGC,它们影响采集图片的质量,DTR 是放电时间寄存器,影响着图像背景亮暗程度。
图2.1
2.3.1指纹比配
指纹匹配指的是通过对两枚指纹特征集间的相似性比较,来判断对应的指纹图像是否来自同一手指的过程,它是一种非常经典而又亟待解决的模式识别问题。目前,指纹细节点匹配算法分类有多种: 根据指纹识别的目的可以分为一比一匹配和一比N匹配; 根据操作过程的差异可分为自动匹配 和人机交互匹配; 根据匹配适应性可以分为弹性匹配和刚性匹配。根据指纹细节点定义和相似性判断函数选取的不同,指纹匹配方法更是多种多样的,比如基于奇异点的、基于三角形的、基于极坐标变换的,基于动态规划的、基于图匹配的等等方法,不胜枚举。需要说明的是这些分类方法都难以囊括所有的指纹匹配算法,因为同时有很多算法彼此交叉。需要指出的是,上述分类方法并不是绝对的,各种方法是相互联系的,每个算法都有自己的特点,并针对特殊的应用。比如: 图匹配的方法对质量差指纹图的噪声抗干扰能力较好,但方法未经大规模实验的证实; 细节点匹配对质量好的指纹图像计算准确,纹理特征的可区分性不强; 基于纹理信息和串匹配的混合匹配方法在一定程度上提高了识别率,但是计算代价非常高; 基于三角匹配和动态规划的混合匹配方法可以解决非线性形变的问题,但是提取的特征过大,难以满足在线实用的要求。总而言之,指纹图像的几何影像形变及错位等问题是匹配算法需要做的首要工作。因此,在指纹识别中必须考虑这些指纹图像中可能存在的线性或非线性形变。目前已有的算法依赖一个前提条件: 待匹配的两幅指纹图像是使用相同配置、相同采集仪来采集的,即同模态,并且,这些指纹允许存在一定程度的噪声。而匹配算法的最终目的是对给定的两幅指纹,寻求使这两幅图像的灰度(或特征)相似度之间差异达到最小的方法。在这种情况下,主要的工作常常是对指纹形变问题的研究,建立一个定义在有穷的形变参数空间的带参数的形变变换模型,最后进行形变参数最优化处理[7]。
2.3.2图像场计算
图像场计算包括图像的强度场、梯度场、方向场以及频率场计算。首先本研究采用Soble算子求指纹图像灰度函数,再分别沿x 和y 方向偏导Ax ( x,y)和Ay ( x,y),计算该指纹图像的梯度场,因为梯度场可以较好地分割指纹图像。
2.4细节提取
细节点对应的脊线用在与该脊线上的采样点来表示,采样的距离约为脊线间的平均距离。脊线分支点对应的脊线是与该细节点的方向最近的那条。脊线末梢对应的脊线则就是该细节点所在的脊线。采样点用该点与对应细节点的距离di和连接该点与对应细节点的直线与对应细节点方向的夹角αi来表示, αi的取值范围是-180到180度[8]。细节点对应的脊线及脊线上的采样点的例子。在细节匹配中,对应脊线将被用来对用来匹配的两个平面点集进行校准,而且,校准的参数,也就是两个点集中任意一对脊线间的旋转角度,将被用来作为判断它们所对应的细节点能否看作匹配的细节点的条件。
第3章系统的硬件设计及软件设计
3.1指纹识别系统的硬件
图3.1所示是本STM32指纹识别系统的硬件框图。从图3.1中可以看到,本系统主要由指纹数据采集模块、微处理器模块、数据存储模块和通讯模块等四个模块组成。本系统以本处理器为核心来驱动指纹传感器采集指纹,并将指纹数据放入存储器中,此数据可以被PC通过串口获取,也可以保存在数据存储器中。
指纹数据采集模块可利用软件方式来判断是否进行指纹的采集。当进行指纹采集时,指纹传感芯片将按照设定的参数来采集指纹,并将模拟图像转换成数字图像,然后在ARM的控制下,将数据存储在外部数据空间,以等待下一步的处理。指纹识别系统的硬件框图如下。
图3.1
微处理器模块以ARM和数据存储器为核心,可对采集到的指纹图像进行相应的预处理,并通过对发光二极管的控制来显示指纹预处理结果。数据存储模块由SDRAM、FLASH构成。其中Flash中存放的是系统的应用程序和一个指纹预处理后的数据,系统上电后,即可通过“BootLoader”功能将程序加载到FLASH中以便程序运行。功能将程序加载到FLASH中以便程序运行。SDRAM用来存放指纹图像并提供程序运行时所需要的临时数据空间。通讯模块的设计要考虑到处理的简易性。本系统的指纹数据上传采用的是串口方式。
3.1.1采集方式
MBF200[9]有三种总线接口:USB接口、微处理器总线(MCU) 接口和串行外设接口(SPI)。使用时可由模式选择管脚MODE [1:0] 确定其所处的工作模式。在MCU接口模式, 通过自动增加行列地址寄存器的值以及模数转换的路径优化功能,可使FPS200内置的标准8位微处理器总线的性能大大加强,其图像传输速度可达到30帧/秒,故可以满足连续指纹图像的采集和比对。
在SPI接口模式,MBF200传感器可通过其内置的SPI接口来减小MBF200对硬件的依赖,这样,系统只需6条线就可以与带SPI接口的微处理器相连接。在SPI模式下,MBF200的图像传输速度为10帧/秒。而在USB接口模式下,由于FPS200内置有高速USB核电路,其外部不再需要其它USB控制器,因而可作为标准的USB设备来使用。在USB模式下,MBF200的图像传输速度为13帧/秒。
3.1.2 MBF200传感器概述
富士通公司的MBF200固体指纹传感器是一款直接接触的指纹识别芯片。它具有高性能、低功耗、低成本的特性,是电容性传感器,在传感阵列中有一个二维的金属电极传感阵列,每一个金属电极充当电容的一个电容板,接触的手指作为电容的另外一个电容扳,器件表面的钝化层作为两板的绝缘层。当手指触摸传感器表面时,指纹的高低不平就会在传感器阵列上产生变化的电容,从而引起二维阵列上电压的变化,并形成指纹传感图像。tdBF200是根据标准的CMOS工艺制造而成,传感阵列为256X 300,有50um时间延迟,产生的图像的分辨率为500dpi。该芯片的特点是:电容性固态传感器;500dpi的分辨率(50um间隔);传感器面积为1.28cmX 1.50cm:256X 300的传感阵列;工作电压范围为3.3V一5V;特别的硬抗化学的保护涂层;集成了8位ADC:3种总线接口,即8位微处理器(MCU)总线接口、集成的USB全速接口及集 成的串行周边1发备接口MBF200的传感器阵列由256行300列的传感器单元组成,每一列有两个采样保持电路,每次捕获一行指纹图像数据。行捕获分为两个阶段,第一阶段,将电容板的被选行充电到3.3V或5V,在充电的同时,一个内部信号使自&一个采样保持电路以采样被选行的电容单元电压;第二阶段是传感器板放电阶段,放电快慢由放电电流寄存器。
3.1.3MBF200主要寄存器
地址标识功能:0x00RAH行地址高位;0x01RAL行地址低位;0x02CAL列地址低位;0x03REH行末地址低位;0x04REL行末地址低位;0x05CEL列末地址低位;0x06DTR放电时间寄存器;0x07DCR放电电流寄存器;0x08CTRLA控制寄存器;A0x09LTRLB控制寄存器;B0x0ACTRLC控制寄存器;C0x0BSRA状态寄存器;0x0CPGC可编程增益控制寄存器;0x0DICR中断控制寄存器;0x0EISR中断状态寄存器;0x0FTHR门限寄存器;0x10CIDH芯片标识高;0x11CIDL芯片标识低;0x12TST测试模式寄存器。这些就是MBF200的主要寄存器。
由于列地址最大为256,所以,MBF200只有一个列开始寄存器CAL和一个列结束寄存器CEL。另外,THR用于在自动检测指纹时设置门限电压。PGC用于在A/D转换时设置放大器的增益。
3.1.4MBF200的主要功能
MBF200的传感器阵列由256列300行的传感器单元组成。每一列有两个采样保持电路,每次捕获一行指纹图像数据。行捕获分为两个阶段,第一阶段,将电容板的被选行充电到3.3V或5V,在充电的同时,一个内部信号使能一个采样保持电路以采样被选行的电容单元电压;第二阶段是传感器板放电阶段,放电快慢由放电电流寄存器决定。放电阶段结束后,可由一个内部信号使能另一个采样保持电路去采样电容单元的最后电压,充电电压与放电电压之差就是所要测量的有用传感信号电压。行捕获结束之后,接着对该信号进行数字化,从而完成一次采样。实际上,该芯片的灵敏度是由放电电流和放电时间寄存器来调节的。
3.1.5 SPI通信模式
MOTOROLA公司的SPI总线的基本信号线为3根传输线,即SI、SO、SCK。传输的速率由时钟信号SCK决定,SI为数据输入、SO为数据输出。它包含了一个主片和多个从片,主片通过发出片选信号-CS来控制对哪个从片进行通信,当某个从片的-CS信号有效时,能通过SI接收指令、数据,并通过SO发回数据。而未被选中的从片的SO端处于高阻状态。主设备通过产生移位时钟来发起通讯。通讯时,数据由SO 输出,SI 输入,数据在时钟的上升或下降沿由SO 输出,在紧接着的下降或上升沿由SI 读入,这样经过8/16 次时钟的改变,完成8/16 位数据的传输。
3.2 STM32指纹识别的软件
本程序是以IAR Embedded for ARM 作为系统的一种专门嵌入式微处理器所开发的环境,其特点开发容易,简答易学,代码紧凑。其包括项目管理,编辑器、C/C++编译器和 ARM汇编器、连接器和支持 RTOS 的调试工具 C-SPY。IAR EWARM 内部开发了全软件模拟功能,可以在没有外接硬件设备的情况下进行调试,通过软件自带的模拟程序实现任何 ARM 内核和外部环境的模拟。其中IAR公司还推出了芯片仿真器,支持无缝连接。只需将该仿真器的两端通过 JTAG 接口和 USB 接口分别与STM32 芯片和计算机相连,即可实现与 IAR EWARM 的连接进行软件的仿真和调试,下载速度可达 800kb/秒,并且无需任何驱动程序,简单方便,是最实用有效的 ARM 系统软件开发的工具。
在 IAR EWARM 下实现程序开发,并对开发的程序进行仿真和调试的具体流程如下:
(1)新建工作区,然后创建工程,生成一个新的项目,添加要开发的所有应用程序,选择芯片类型同时配置编译和连接相关参数和输出文件路径等。
(2)编译和连接项目中的应用程序,生成编译器列表文件和连接存储器分配文件。
(3)使用 j-link 仿真器调试和运行程序,同时设置断点。
3.2.1系统主程序设计
指纹识别的主程序是将指纹处理的各个阶段:包括指纹采集、图像的预处理、提取特征点、图像匹配整个过程组合在一起实现嵌入式系统的指纹识别,在组合的过程中,要实现算法程序的移植、系统存储空间的分配和算法的优化等各个部分,最后实现准确高效的指纹识别。其系统的主程序流程图如图3.2所示。
主程序的主要初始化函数如下:
RCC_Configuration();//系统时钟初始化
NVIC_Configuration(); //中断初始化
GPIO_Configuration(); //GPIO 初始化
USART_Configuration(); //串口初始化
MBF200_Init(); //MBF200 初始化
LCD1602_init(); // 1602 液晶初始化
FSMC_SRAM_Init();//SRAM 初始化
图3.2.指纹识别系统流程
3.2.2传感器初始化程序
对于传感器的初始化,实际上是主控制器通过 SPI 通信对传感器内部寄存器写数据的过程,当写数据时,通过先发送写命令 0X02,再发送要写的寄存器地址,最后向相应地址的寄存器写入数据,整个过程遵循 SPI 时序。需要强调一点,根据 MBF200 的技术资料中写数据的时序图,这里要写的寄存器地址是原地址的值左移 3 位然后补零而形成的新的地址值。初始化 CTRLB,使能芯片的 ENABLE 位,使其处于工作状态,传感器启动内部 A/D 转换,XTALSE 位选择内部 12M 晶振,同时使能指纹自动检测,通过判断 RDY 位的状态决定指纹图像数据的读取;当有手指按在传感器的电容阵列区域时,传感器自动唤起电路启动,开始由休眠转入工作状态,同时向主控制器发送一个中断信号,传感器开始逐行采集指纹的每一个像素,经过A/D 转化后,将数据暂存在 CTRLA 中,主控制器接收到中断后,等待 A/D 转换结束,开始读取 CTRLA 的数据,读取结束后则继续等待 A/D 转换数据,如果没有能够读到该行的最后单元,则返回CTRLA 寄存器,继续读取 A/D 转换数据,否则需要判断是否读到图像的最后单元,如果到图像末尾则整个采集工作结束,否则继续等待传感器捕获指纹信息,读取下一行数据。
这里给出传感器的初始化程序:
void MBF200_Init()
{
MBF _WriteREG(0x06, 0x38);//初始化寄存器 DTR
MBF _WriteREG(0x07, 0x01);//初始化寄存器 DCR
MBF _WriteREG(0x0C, 0x0C);//初始化寄存器 PGC
MBF _WriteREG(0x0F, 0x2C);//初始化寄存器 THR
MBF _WriteREG(0x0E, 0x03); //初始化寄存器 ISR
MBF _WriteREG(0x09, 0x0D);//初始化寄存器 CTRLB
MBF _WriteREG(0x00, 0x00);//初始化寄存器 RAH
MBF _WriteREG(0x01, 0x00);//初始化寄存器 RAL
MBF _WriteREG(0x02, 0x00);//初始化寄存器 CAL
MBF _WriteREG(0x03, 0x00);//初始化寄存器 REH
MBF _WriteREG(0x04, 0x00);//初始化寄存器 REL
MBF _WriteREG(0x05, 0x00);//初始化寄存器 CEL
MBF _WriteREG(0x0A, 0x00);//初始化寄存器 CTRLC
MBF _WriteREG(0x08, 0x00); //初始化寄存器 CTRLA
}
3.2.3存储器的扩展程序设计
STM32对SRAM存储器的扩展主要是通过对FSMC的配置实现的,系统选择Bank1的子Bank3,根据存储器 IS62WV51216BL 的映射位置FSMC_BCR3 和FSMC_BTR3/BWTR3进行设置。
首先选择芯片映射到 Bank1 的第 3 个子 Bank,设置对 SRAM 的读/写使用相同时序,这样对时序寄存器只需要设置 BTR3 就可以了,选择存储器的类型为 SRAM,设置数据宽度为16(bit),禁止对地址和数据的复用,配置等待时序为在等待前的一个周期有效,同时使能芯片写操作,这样就完成了对该寄存器的初始化。STM32 的 FSMC 固件库里包含了 NOR Flash 控制器所有操作固件,通过对数据结构FSMC_NORSRAMTimingInitTypeDef 内部成员的设置可以实现时间参数寄存器 FSMC_BTR3和 BWTR3 的转变,使得内部成员的设置可以实现对基本特征参数配置寄存器 FSMC_BCR3 的初始化。
3.2.4串口程序的设计
将指纹传感器采集到的指纹数据保存在外部SRAM的全局数组中必须用到主控制器。系统通过设计串口程序建立主控制器与上位机的异步串口通信,对主控
制器的串口进行初始化,对串口的相关参数进行设置,当到波特率选择最大值为115200时,并启动UART1,即可通过串口发送和接收函数实现与上位机的数据交互。采集的指纹数据通过串口线被发送到上位机的接收数据缓冲区,需要在上位机设计串口程序将缓冲区的数据进行接收和保存。对次设计而言,MSComm 控件封装了与串口相关的所有API 函数,在设计时只需要调用相关属性、方法、事件就可以实现对串口通信的开发,而不需要学习复杂的 API 函数,相对简单。因此本设计采用 MSComm 控件在 VC++环境下实现对串口程序的开发。
本设计选择事件驱动法,对 MSComm 控件的常用属性,其中包括端口号、通信参数、通信协议、端口状态等进行初始化设置,并打开通信端口,然后通过 OnComm 事件的 CommEvent 属性的值来判断是否有数据发送或接收。当下位机开始发送数据时,即发生了一个通信事件,将引起上位机程序产生 OnComm 事件,并使得其 CommEvent 属性的值将发生改变,应用程序根据CommEvent 属性值为2,表示缓冲区接收到字符,开始使用 GetInput()函读取接收缓冲区数据,由于在读取和发送数据的过程中,使用的数据类型都为 VARIANT 型,因此需要将读取的缓冲区数据保存在一个 VARIANT [10]变量中,然后将该变量中的 VARIANT 型数据转换为Cstring 型变量存入全局数组。
3.2.5移植算法程序
研究算法时一般不用考虑存储空间的分配问题,所以系统的内部存储空间做够大,能够满算法处理的要求对于嵌入式微处理器而言,芯片内部存储空间有限,指纹的处理算法需要处理的数据量相对较大,其采集的指纹图像、提取特征模板和运行的程序代码都会占据较大的存储空间,合理的分配存储空间对系统算法的执行十分重要。算法中间处理的临时图像通过建立全局数组的方式存储在外部 SRAM 中;指纹提取的模板特征点以结构体的形式存放在 FLASH 中;便于以后对其进行添加和删除;指纹的待匹配特征点通过分配动态内存来保存,当系统识别结束后,即将该数据释放,为系统的存储空间节省了资源。系统处理过程中的临时图像数据就存放在该全局数组中。对应外部SRAM,可以通过两个指针lpDIBBits(原图像指针)和 lpDataOut(目标图像指针)指向该数组,以这两指针算法的输入输出端口可实现图像算法处理,即将指纹图像处理前后的数据都保存在该数组中,避免了系统存储资源的浪费。在指纹图像的采集部分,通过对图像边缘处不重要的图像信息进行裁剪,使得采集的图像为 250*200,同时对于存储在数组中的矩阵图像数据,通过抽样提取的方式对图像矩阵的行和列进行了减半缩小[11],使得图像变为原来的 1/4 即为 125*100 的图像,这两个方面的处理使得图像的数据量得到了较大减少,提高了系统的执行效率。
第4章结果分析
4.1图像匹配测试
图像特征匹配主要是通过统计匹配的特征点数计算两幅图像的相似度,验证图像的匹配,算法通过对特征点匹配的相似度进行计算,如果两幅指纹图像相似度于 0.6,则认为两幅指纹来自同一个手指的指纹。VC 上针对两幅图像的匹配设计特征点匹配界面如图4.1
图4.1特征匹配界面
将图像的预处理和细节特征点匹配算法相结合,从原指纹图像开始对图像的预处理算法和指纹的匹配算法进行整体性能的测试。采用指纹传感器采集的指纹图像作为输入图像,通过指纹算法处理,根据图像的匹配程度给出匹配结果,匹配成功则输出”same image”, 匹配失败则输出“different image”.
4.2指纹识别系统测试
通过将 VC++的指纹识别算法移植到嵌入式系统中,搭建嵌入式指纹识别系统平台,并对图像的识别算法进行测试。
匹配成功 LCD1602 输出”same image”字符串, 匹配失败LCD1602 输出“different image”字符串。
通过在嵌入式系统上的验证,指纹识别算法在该系统是上的识别准确率有所降低,分析主要原因可能是系统为了提高处理速度,对指纹图像进行了抽样缩小处理,使得图像损失了部分的特征信息,识别的准确率有所下降,不过仍然保持在 95%的水平。图片数据量的减小使得系统在识别效率上得到了较大的提高。原来系统整个识别过程大概需要 6s 的时间,通过改进识别时间可以控制在 3s 以内,大大提高了系统的识别效率。
第5章总结
随着社会的发展,技术的不断进步,生物识别作为一种方便有效的身份认证技术,越来越受到人们的青睐,指纹识别技术作为生物识别技术中最为成熟的一种,一直都是人们研究的重点,特别是嵌入式技术在指纹识别方面应用以来,提高了指纹识别系统的性价比,为指纹识别系统走向民用提供了便利,目前人们已经开发出了多款不同的嵌入式指纹识别系统,并且广泛应用在社会的各个领域。本文对现有指纹识别技术原理和研究现状进行了简要分析,并对指纹算法和嵌入式系统进行研究,通过对现有指纹处理算法进行改进,设计了一种基于 STM32 的嵌入式指纹识别系统,并在该系统上对指纹识别的可行性进行了验证。本文的研究工作主要包括如下几个方面。本设计实现了指纹图像从采集到指纹识别的整个过程,但毕竟笔者对指纹识别技术的研
究才刚刚起步,设计的系统在一些方面还存不足,需要进一步的改进。指纹采集的质量直接影响着算法的复杂度,系统在指纹算法处理方面,有较大一部分是对采集图像做预处理增强,如果能采集到高质量的指纹图像,将减少较多不必要的预处理算法,进而提高系统算法执行的效率。该传感器具有 MCU、SPI 和 USB 三种接口模式,其中 SPI 接口的速度较慢,如果改为 MCU 接口的采集模式将较大的提高系统的采集效率。另外,本设计只是实现了指纹的识别,还缺少键盘和模式设置等人机交互界面,同时考虑到系统的成本和设计难度,选择 STM32作为主控芯片,对指纹识别系统进行了开发,使得降低了较大成本,但系统的性能与 DSP 处理效果还是存在差异,这里 STM32 芯片内部虽然集成了乘法器,但是其在主频上还是存在较大的不足,如果将 STM32 与 DSP 处理芯片相结合来实现指纹识别系统,将较大的提高整个系统的性能。
参考文献
[1]杨艳.生物特征识别技术综述[J].大众科技2006(3):31-33.
[2]柴晓光;岑宝炽.民用指纹识别技术[M].北京:人民邮电出版社.2004(5):7-9.
[3]宋娟.生物识别技术中的智能算法[D].湖南师范大学硕士学位论文.2007:1-3.
[4]刘波.指纹图像增强及匹配算法研究[D].华中科技大博士学位论文2009(6):2-5.
[5]祝恩;殷建平;张国敏;胡春风.自动指纹识别技术[M].国防科技大学出版社.2006(5):7-9.
[6]陈桂友.自动指纹识别系统中的关键算法研究及应用[D].山东大学博士学位论文.2005(10):61-62.
[7]毛容芳.指纹配准和自动识别的实现[D].武汉理工大学硕士学位论文.2007(5): 42-43.
[8]毛克明.指纹图像处理与匹配技术研究[D].东北大学博士学位论文.2009(5):87-89.
[9] MBF200 solid state Fingerprint Sensor Data Sheet[J]. 2010(5):1-5.
[10] IAR EWARM 5.11 使用指南[J].2010(4):1-3.
[11]陈庆接.基于DSP 的指纹处理算法研究与实现[D]重庆大学硕士学位论文.2005(5):46-47.
附录1
初始系统扩展外部 SRAM 的初始化代码:
void FSMC_SRAM_Init(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
/*-- FSMC Configuration ------------------------------------------------------*/
p.FSMC_AddressSetupTime = 0;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 2;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC Bank1_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);
}