《嵌入式Linux编程入门与开发实例-第14章.ppt》由会员分享,可在线阅读,更多相关《嵌入式Linux编程入门与开发实例-第14章.ppt(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第1414章章 ARM Linux ARM Linux 指纹门禁系统指纹门禁系统 指指纹纹识识别别技技术术是是一一种种重重要要的的生生物物身身份份识识别别技技术术,也也是是目目前前生生物物识识别别技技术术发发展展的的最最为为成成熟熟的的一一个个分分支支,它它已已经经成成为为生生物物特特征征识识别别技技术术的的主主流流。早早期期的的指指纹纹识识别别系系统统需需要要在在计计算算机机上上处处理理,使使得得其其便便携携性性受受到到了了限限制制。随随着着嵌嵌入入式式技技术术的的不不断断发发展展与与更更新新,以以及及ARM等等嵌嵌入入式式处处理理器器性性能能的的不不断断升升级级,使使基基于于嵌嵌入式的指
2、纹识别获得实用。入式的指纹识别获得实用。第第1414章章 ARM Linux ARM Linux 指纹门禁系统指纹门禁系统 自动指纹识别系统概述自动指纹识别系统概述 14.1指纹识别原指纹识别原 14.2系统硬件结构介绍系统硬件结构介绍 14.3 指纹采集芯片指纹采集芯片fps200fps20014.4第第1414章章 ARM Linux ARM Linux 指纹门禁系统指纹门禁系统 LinuxLinux操作系统移植操作系统移植 14.5系统软件设计系统软件设计 14.614.1 14.1 自动指纹识别系统概述自动指纹识别系统概述 指指纹纹识识别别技技术术是是通通过过计计算算机机实实现现的的身
3、身份份识识别别手手段段,也也是是当当今今应应用用最最为为广广泛泛的的生生物物特特征征识识别别技技术术之之一一。个个人人身身份份的的确确认认和和权权限限的的认认定定是是生生活活中中的的一一个个非非常常重重要要的的环环节节,尤尤其其是是随随着着网网络络化化时时代代的的来来临临,人人们们对对于于安安全全性性的的要要求求越越来来越越高高。但但是是,越越来来越越繁繁琐琐的的密密码码设设置置也也成成为为了了摆摆在在人人们们面面前前的的一一大大心心病病,开开机机密密码码、邮邮箱箱密密码码、银银行行密密码码、论论坛坛登登陆陆密密码码,密密码码管管理理对对于于高高安安全全性性的的商商务务生生活活而而言言显显得得
4、尤尤为为重重要要。为为了了实实现现较较高高的的安安全全性性,使使用用复复杂杂和和更更不不方方便便的的密密码码是是目目前前流流行行的的选选择择,而而如如果果对对身身边边不不同同的的设设备备使使用用一一个个相相同同的的密密码码,那那么么在在得得到到了了方方便便性性的的同同时时也也增增加加了了安安全全性性的的隐隐患患。但但是是如如果果设设置置成成不不同同的的密密码码,又又很很容容易易记记混混。此此时时,指指纹纹识识别别技技术术提提供供了了一一种种新新的的思思路路,这这种种既既方方便便又又安安全全的的技技术术很很快快成成为为了了很很多多学学者者研研究究的的新新方方向向,带来了巨大的市场前景,并将对国际
5、、国内安防产业产生新的影响带来了巨大的市场前景,并将对国际、国内安防产业产生新的影响。指纹识别的应用领域非常广阔,包括以下几个方面:(1)指纹支付:通过把指纹与银行卡绑定的方式,用指纹轻轻一点来完成消费支付。这种新型应用在美国已经出现至少2年以上。国内2006年上海某公司也已经涉足指纹支付市场。(2)汽车指纹防盗:通过指纹控制车门开关,或者控制引擎点火是指纹技术在汽车防盗方面的典型应用。国内个别厂商已经推出指纹防盗产品。(3)指纹UKEY:指纹UKEY是网上银行业务用于进行身份验证的终端,它比目前的帐号密码验证以及普通UKEY验证要更为安全些。完全不需要密码或PIN,使得病毒软件无可乘之机,也
6、杜绝了网银帐号盗用的可能。它将大大提升网银业务的诚信度和安全性,为银行真正扩大网上交易量。(4)指纹IC卡:目前的IC大多是不记名的IC,记名也都是用密码。随着IC在人们生活中的使用频度增加,IC卡中的信息甚至代表着特殊的权力和金钱。通过在IC卡中存入持卡人的指纹信息,可以大大提高IC卡的安全性。图图14-1 典型的指纹识别系统典型的指纹识别系统 14.214.2指纹识别原理1、预处理、预处理2、指纹特征、指纹特征3、指纹提取方法、指纹提取方法4、指纹图像增强方法、指纹图像增强方法5、指纹特征值的提取、指纹特征值的提取6、指纹图像匹配、指纹图像匹配7、指纹识别系统的性能参数、指纹识别系统的性能
7、参数 1.预处理 预处理在整个自动指纹识别系统的过程中是很关键的第一步,是正确地进行特征提取、匹配等操作的基础。在指纹图像采集过程中,由于表面皮肤特性、采集条件以及成像传感器特征差异等各种原因的影响,采集的指纹图像是一幅含多种不同程度噪声干扰的灰度图像,指纹脊线可能被断开、桥接或模糊等,这种噪化的指纹脊线结构严重地影响着指纹识别系统的性能。预处理的目的就是利用信号处理技术去除图像中的各种噪声干扰,把它变成一幅清晰的指纹图像,恢复指纹的脊线结构,以便可靠提取正确的指纹特征。因此,预处理性能的好坏直接影响着指纹识别的效果。指纹预处理的一般过程:首先提取出指纹的方向图,然后基于此方向图,做了灰度图像
8、的滤波,从而使二值化、细化。2.指纹特征 指纹特征通常可通过指纹的两类特征进行验证:总体特征和局部特征。在考虑局部特征的情况下,只要比对13个特征点重合,就可以确认是同一个指纹。总体特征:指那些用人眼就可观察到的特征,包括基本纹路图案、模式区、核心点、三角点、式样线和纹数等。基本纹路图案有环形、弓形、螺旋形。如图14-2所示。局部特征:即指纹上节点的特征,这些具有某些特征的节点成为特征点,即指纹纹路上的终结点、分叉点和转折点。指纹特征点可以用以下4种特征来描述:位置:特征点的位置通过坐标来描述,可以是绝对的,也可以是相对于三角点的。方向:指该特征点所在的局部脊线的方向。分类:特征点有终结点、分
9、叉点、孤立点、分歧点、环点、短纹等。脊线:特征点对应的脊线用在该脊线上的采样点表示。图14-2 指纹的特征图3.指纹提取方法 常用的指纹取像方法有以下几种:光学设备取像,晶体传感器取像,超声波设备取像。其中超声波扫描被认为是指纹取像技术中非常好的一类。表14-1 三种指纹提取技术的比较技术种类体积耐用性成像质量成本功耗光学全反射技术大非常耐用干手指较好低较多晶体传感技术小容易损坏干手指好较低较少超声波扫描技术中一般非常好高较多4.指纹图像增强方法 细节特征提取算法的性能严重依赖于输入指纹图像的质量。然而指纹源图像同真实指纹由于图像的变形而会导致不同,其中许多畸变、变形是由指纹图像获取时产生的。
10、如:不一致的接触。不均匀的接触。不可再现的接触。采集设备本身的噪声干扰。这些因素将导致待分析的指纹图像产生一定数量的可疑特征点以及大量真实特征点被忽略并引入大量的错误信息。为了确保细节特征算法的性能,需要进行指纹图像增强。一般来说,图像的增强采用平滑、滤波、二值化、细化等数字图像处理方法来进行。实际实现时,指纹图像增强一般采用以下几个环节:规格化,方向图估计,频率图估计,生成模板、滤波。一幅指纹图像经过规格化后,才能将该图的均值和方差控制在给定范围,以便后续处理。对指纹图像规格化目的是将该灰度图的方差降低。5.指纹特征值的提取 特征提取是指纹识别系统的关键部分之一,因此特征提取的好坏直接影响到
11、以后的指纹匹配的结果。如果输入图像的质量很好,很容易确定其结构,此时的特征提取只是从细化后的单象素的纹线提取细节点的简单过程。但实际上,由于受很多因素的影响,输入指纹图像并不具备很好的脊线结构,指纹线也不是单个象素的。这使得特征提取的准确性受到影响。在进行特征提取的过程中一般要进行细节点处理。用来匹配指纹图像的点称为细节点,在指纹图像拓扑中,他们是脊终点和分叉点。单独点包括中心点和三角点。三角点和中心点之间的距离以及脊线的数目一般认为不会随图像变换、旋转、放大和缩小而改变。因此,往往利用这一特性来减少匹配时数据库的搜索空间。6.指纹图像匹配 指纹图像匹配就是对两个输入指纹的特征集合(模板)判断
12、是否属于同一指纹。指纹对比有两种方式:(1)一对一指纹验证:根据用户ID从指纹库中检索出要对比的指纹,在与新扫描得到的指纹进行对比;(2)一对多指纹验证:新扫描得到的指纹和指纹库中的指纹逐一进行对比。7.指纹识别系统的性能参数l FAR(False Accept Rate):认假率,两个不同指纹被系统判断为同一指纹的概率,也就是系统不安全的概率。通常为0.1%0.001%。l FRR(False Reject Rate):拒真率,同一指纹两次采样被系统判断为不同手指的概率,即可以通过验证的人被拒绝的概率。l FER(False To Enroll):错误登记率,手指指纹太差,不能登记的概率。l
13、 Verification Time(1:1):验证时间,比较判断两枚指纹是否相同的时间。l Identify Speed(1:N):识别速度,对一枚指纹在指纹数据库中查找与之相应的指纹所需的时间,质问查找速度,这与指纹数量、指纹数据库大小有关。l Template Size:特征值长度,提取指纹特征值的字节数。14.314.3系统硬件结构介绍图图14-3 指纹识别系统硬件结构图指纹识别系统硬件结构图14.414.4指纹采集芯片fps200 指指纹纹图图像像的的采采集集是是自自动动指指纹纹识识别别系系统统(AFIS)的的重重要要组组成成部部分分。早早期期的的指指纹纹采采集集都都是是通通过过油油
14、墨墨按按压压在在纸纸上上产产生生的的,如如NIST4、NIST9、NIST14等等这这些些标标准准指指纹纹数数据据库库就就属属于于这这一一类类。那那时时候候AFIS系系统统的的应应用用范范围围也也比比较较窄窄,主主要要用用于于大大规规模模指指纹纹数数据据库库的的管管理理和和检检索索,属属于于离离线线处处理理类类型型。20世世纪纪80年年代代,随随着着光光学学技技术术和和计计算算机机技技术术的的发发展展,开开始始出出现现了了光光学学的的指指纹纹采采集集仪仪;20世世纪纪90年年代代中中期期,随随着着半半导导体体技技术术的的进进步步,开开始始陆陆续续出出现现CMOS指指纹纹传传感感器器、热热敏敏传
15、传感感器器、超超声声波波传传感感器器等等新新型型传传感感器器。与光学传感器相比,它们具有体积小、价格低的优点。与光学传感器相比,它们具有体积小、价格低的优点。fps200芯片是Veridicom公司生产的第三代半导体触摸式指纹传感器。fps200指纹传感器采用CMOS技术,由256300个电容传感阵列组成,其传感区域为1.28cm1.50cm,分辨率高达500 dpi(每英寸点),工作电压范围为3.35 V,提供与8位微处理器相连的接口,传感器内部有8位高速A/D转换器,可直接输出8位灰度图像,并具有两组采样保持电路。fps200基于电容充放电原理,传感阵列的每一点是一个金属电极,相当于电容器
16、的一个极,与传感区接触的手指充当电容器的另一个极,而两者之间的传感面形成电容两极之间的介电层,由于指纹的脊和谷导致了传感阵列各电容值的不同,传感器将电容值数字化之后输出。fps200的结构框图如图14-4所示。图14-4 fps 200内部结构框图主要特征和优点如下:(1)fps200的表面采用Veridicom公司专利技术而制成,坚固耐用,可防止各种物质对芯片的划伤、腐蚀、磨损等,能承受超过8KV的静电放电(ESD),可应用在各种苛刻的环境下。(2)fps200是第一个内置USB口、微处理器单元接口(MCU)、串行外设接口(SPI)三种通信接口的指纹设备,使得fps200能够容易地集成到各种
17、类型的设备中,甚至不需要外部接口设备的支持。(3)fps200芯片的256300传感阵列和全新的超薄封装不但提供了更小的外观尺寸,而且使阵列布局更合理,在减小传感器阵列数目的情况下并不降低图像的尺寸及精度,同时也节约了芯片的成本。(4)fps200的图像搜索功能(ImageSeekTM)通过改变电容阵列的参数值可在1秒种以内扫描多幅指纹图像并自动选择最好的一幅。因此fps200对人类手指的适应面更广,可以获得各种类型手指(过干或过湿)的高质量指纹图像,并能应用在各种气候条件下,甚至在高温或高湿度的环境下。由于成像的质量与稳定性的提高,大大减低了误识率(FAR)和拒识率(FRR)。(5)具有较大
18、的图像数据存储空间;(6)手指自动检测(AFD)功能可以唤醒CPU,节约电能的消耗。(7)宽电压工作,3.3V到5V都可稳定工作。(8)低功耗,在5V工作的情况下耗电小于70mW。14.5 Linux14.5 Linux操作系统移植操作系统移植 Linux操作系统的移植包括BootLoader移植、Linux内核移植、添加必要的驱动程序和挂载文件系统。使某个平台的代码运行在其他平台上的过程叫做移植。Linux操作系统就可以移植,使之运行在ARM、PowerPC、M68k等多种硬件平台上。在Linux系统内核代码中有arch目录,其中包含了不同平台的代码,与体系结构相关的代码都放在arch/和i
19、nclude/asm-/目录中,是Linux支持的体系结构的简称。14.5.1 14.5.1 BootLoaderBootLoader移植移植 BootLoader指指系系统统启启动动后后,在在操操作作系系统统内内核核运运 行行 之之 前前 运运 行行 的的 一一 段段 小小 程程 序序。通通 过过 BootLoader,可可以以初初始始化化硬硬件件设设备备、建建立立内内存存空空间间的的映映射射图图,从从而而将将系系统统的的软软硬硬件件环环境境带带到到一一个个合合适适的的状状态态,以以便便为为最最终终调调用用操操作作系系统统内内核核准准备好正确的环境。备好正确的环境。1 首先建立交叉编译环境:
20、(l)在宿主机上安装标准Linux操作系统。(2)宿主机上安装交叉编译器。S3C2410开发板提供的光盘上附有交叉编译器工具ARM-Linux-gcc-2.95.3(源码为cross-2.95.3.tar.bzZ)。先以root用户的身份登陆到linux下。进入/usr/local目录,创建名为arm的目录:cd/usr/local Mkdir arm2 将光盘提供的cross-2.95.3.tar.bzZ解压到/usr/local/目录。然后修改PATH变量,把arm-Linux工具链目录加入到环境变量PATH中:修改/etc/profile文件,添加 pathmunge/usr/local
21、/arm/2.95.3/bin即可。#Path manipulationIfid-u=0;thenPathmunge /sbinPathmunge/usr/sbinPathjmunge/usr/local/sbinPathmunge/usr/local/arm/2.95.3/binfi3 vivi要用到kernel的一些头文件,所以需要kemel的源代码,要把Linux的kernel准备好。将vivi和kernel都解到相应目录下,然后需修改/viv/Makefile里的一些变量设置:(1)Linux_INCLUDE_DIR=kernel/include/(2)(2)CROSS_COMPILE
22、=/usr/local/arm/2.95.3/bin/arm-Linux-4 进入/vivi目录执行 make distclean。进入/vivi目录里,输入“make menuconfig”,开始选择配置。保存配置后再输入“make”正式开始编译。在/vivi里面生成“vivi”,这就是后面要烧写到Flash中的bootloader。14.5.2 14.5.2 Linux内核移植到S3C2410 Linux内核主要由进程调度、内存管理、虚拟文件系统、网络接口、进程间通信等5个子系统组成。Linux内核移植需要设置环境变量,并修改以下方面:1、根目录 2、arch目录 3、config.in
23、4、arch/arm/boot 5、arch/arm/def-configs目录 6、arch/arm/kernel目录1 根目录修改根目录下的Makeflle文件,打开最上层目录下的Makefile文件,这个文件中需要修改的内容包括以下两个方面。指定目标平台:移植前 ARCH:=$(shell uname-m|sed-e s/i.86/.)移植后ARCH:=arm指定交叉编译器:移植前CROSS_COMPILE=移植后CROSS_COMPILE=arm-Linux-2 arch目录arch目录存放着和体系结构相关部分的内核代码。arch/arm中需要修改makefile文件,添加下面内容。移
24、植后:ifeq($(CONFIG_ARCH_S3C2410),y)TEXTADDR=0 xC0008000MACHINE=s3c2410EndifTEXTADDR决定内核起始运行地址,即image.ram应下载的位置。3 config.inconfig.in是配置文件,运行“make menuconfig”命令时出现的菜单就是config配置的。在config文件中加入相关信息。添加 CONFIG_ARCH_S3C2410子选项。移植后:if$CONFIG_ARCH_S3C2410=y;thenCommentS3C2410 ImplementationDep_boolSMDK(MERI TEC
25、H BOARD)CONFIG S3C2410 SMDK$CONFIG_S3C2410_S3C2410其他选项:If$CONFIG_FOOTBRIDE_HOST=y-o$CONFIG_ARCH_SHARK=y-o$CONFIG_ARCH_CLPS7500=y-o.$CONFIG_ARCH_S3C2410=y-o$CONFIG_ARCH_SA1100=y;then Define_bool CONFIG_ISA yElseDefine_bool CONFIG_ISA n4 arch/arm/boot编译出来的内核存放在这个目录中。Makefile移植后:ifeq($(CONFIG_ARCH_S3C2
26、4l0),y)ZTEXTADDR=0 x30008000ZRELADDR=0 x30008000Endif5 arch/arm/def-configs目录这里定义了一些平台的config文件,如lart和assert等。把配置好的文件复制到这里即可。5 arch/arm/kernel目录这个目录下的内容是与硬件平台相关的内核代码。增加S3C2410的支持。移植后:no-irq-arch:=$(CONFIG_ARCH_INTEGRATOR)$(CONFIG_ARCH_CLPS7llX).$(CONFIG_ARCH_S3C2410)$(CONFIG_ARCH_MXIADS)$(CONFIG_ARC
27、H_PXA)增加其他功能,移植后:obj-$(CONFIG_MIZI)+=event.oObj-$(CONFIG_APM)+=apm2.o在适当的地方加入debug-armv.s和entry-armv.s中的代码。函数是setup_arch用来完成和体系相关的初始化工作,比如对物理内存结构的初始化。14.5.3 14.5.3 加载指纹芯片驱动程序加载指纹芯片驱动程序 本设计中需要通过网口进行交叉编译以及调试,采本设计中需要通过网口进行交叉编译以及调试,采集到的指纹图象还需要通过集到的指纹图象还需要通过LCD进行显示,因此需要添进行显示,因此需要添加相关的设备驱动程序。在开发嵌入式指纹驱动程序时
28、,加相关的设备驱动程序。在开发嵌入式指纹驱动程序时,首先根据首先根据fps200芯片要实现的功能,编写其驱动,然后芯片要实现的功能,编写其驱动,然后把把FPS200硬件驱动程序嵌入硬件驱动程序嵌入Linux中。为了能够使用中。为了能够使用fps200的驱动,需要在的驱动,需要在/dev目录下创建一个设备文件,目录下创建一个设备文件,创建方法如下:创建方法如下:#cd/arm/armroot/dev#mknod fps200 c 200 0 fps200驱动框图如图14-5 所示:图14-5 fps200驱动框图14.5.4 14.5.4 加载文件系统 近近年年来来日日志志文文件件系系统统在在嵌
29、嵌入入式式系系统统上上得得到到了了较较多多的的应应用用,其其中中以以支支持持NOR FLASH的的JFFS,JFFS2文文件件系系统统和和支支持持NAND FLASH的的YAFFS最最为为流流行行。这这些些系系统统都都支支持持掉掉电电文文件件保保护护,同同时时支支持持标标准准的的MTD驱驱动动。本本系系统统需需要要将将采采集集到到的的指指纹纹 图图 像像 保保 存存 到到 NAND FLASH中中,所所 以以 采采 用用YAFFS文件系统。文件系统。YAFFS(Yet Another Flash File System)是 一 种 类 似 于JFFS/JFFS2的专门为Flash设计的嵌入式文
30、件系统。与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。YAFFS还带有NAND芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD和VFS,直接对文件进行操作。NAND Flash大多采用MTD+YAFF的模式。MTD(Memory Technology Deviees,内存技术设备)是对Flash操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开。下面分几个步骤进行根文件系统的加载:1 下 载 YAFFS相 关 文 件,建 立 目 录,更 改 Makefile文 件。其 中 包 括yaffs_ecc.c(ECC校 验 算
31、 法),yaffs_fileem.c(测 试 Flash),yaffs_fs.c(文件系统接口函数),yaffs_guts.c(Yaffs文件系统算法),yaffs_mtdif.c(NAND函数),yaffs_ramem.c(Ramdisk实现)。内核中没有YAFFS,所以需要自己建立YAFFS目录,并把下载的YAFFS代码复制到该目录下面。#mkdir fs/yaffs#cp*.c(yaffs source code)fs/yaffs2 修改fs/Kconfig,使得可以配置yaffs。Kconfig文件中主要是配置一些宏,在MTD上面挂接YAFFS,以及一些辅助配置。3 修改NAND分区。
32、struct mtd_partition smdk_default_nand_part=0=.name=vivi,.size=0 x00020000.offset=0 x00000000,l=.name=param,.size=0 x00010000,.offset=0 x00020000,2=.name=kernel,.size=0 x00100000,.offset=0 x00030000,3=.name=root,.size=0 x01900000,.offset=0 x00130000,4=.name=user,.size=0 x025d0000,.offset=0 x01a30000
33、,;4 配置内核时选中MTD支持和YAFFS支持。配置内核时选中MTD支持:Memory Technology Devices(MTD)一Memory Technology Device(MTD)support*MTD Partitioning support.*S3C2410 NAND driver debug配置内核时选中YAFFS支持:File systems一 Miscellaneous filesystems一 Yet Another Flash Filing System(YAFFS)file system support*NAND mtd support*Use ECC func
34、tions of the generic MTD-NAND driver*Use Linux file caching layer*Turn off debug chunk erase check*Cache short names in RAM5 编译内核并将内核下载到开发板的Flash中。6 建立mount目录。7 在Flash上建立根文件系统。8 重新启动,并改变启动参数。14.614.6系统软件设计系统软件设计 软件部分主要包括系统初始化、指纹采集程序、指纹识别算法等。1、设置入口指针。、设置入口指针。2、设置中断向量、设置中断向量 3、初始化堆栈、初始化堆栈 4、初始化存储器系统。、
35、初始化存储器系统。5、如有必要改变处理器模式、状态。、如有必要改变处理器模式、状态。6、初始化必要的、初始化必要的I/O 状态。状态。7、初始化、初始化C 语言所需的存储器空间。语言所需的存储器空间。8、呼叫、呼叫C 程序。程序。14.6.1 14.6.1 系统的初始化系统的初始化(1)设置入口指针。启动程序首先必须定义入口指针,而且整个应用程序只有一个入口指针。在编译的时候,编译器需要知道整个程序的入口在哪里,所以在编译前要设置好相关的编译选项,如程序入口所在的目标文件。(2)设置中断向量。ARM9 要求中断向量表必须设置在从0 地址开始,连续8 4 字节的空间,分别是复位、未定义指令错误、
36、软件中断、预取指令错误、数据存取错误、IRQ、FIQ 和一个保留的中断向量。对于未使用的中断,使其指向一个只含返回指令的哑函数,可以防止错误中断引起系统的混乱。(3)初始化堆栈。系统堆栈初始化取决于用户使用了哪些处理器模式,以及系统需要处理哪些错误类型。对于将要用到的每一种模式,都应该先定义好堆栈指针。(4)初始化存储器系统。有些芯片可通过寄存器编程初始化存储器系统,还有的通过存储器控制模块的配置寄存器来初始化存储器系统。(5)如有必要改变处理器模式、状态。如果前面已经进行了堆栈的初始化,那么堆栈初始化时的最后一个模式就是现在的处理器运行模式,用户如果有需要改变处理器模式和其它如中断使能的状态
37、位等,可以设置CPSR 来实现。(6)初始化必要的I/O 状态。某些严格的I/O 和用户认为需要在调用主程序前完成的状态控制,可以在启动程序里面完成初始化,特别是一些输出设备,上电后往往呈现一种随机态,需要及时加以控制。(7)初始化C 语言所需的存储器空间。为正确运行应用程序,在初始化期间应将系统需要读写的数据和变量从ROM 拷贝到RAM 里,一些要求快速响应的程序,如中断处理程序,也需要在RAM中运行。(8)呼叫C 程序。在进入主程序之前,需要确定主程序代码的编译模式是ARM 还是THUMB,由此决定相应的跳转指令。fps200 可可以以工工作作在在中中断断方方式式,也也可可以以工工作作在在
38、查查询询方方式式。采采用用查查询询工工作作方方式式。程程序序流流程程大大致致如如下下:先先初初始始化化FPS200 各各寄寄存存器器,往往相相应应的的寄寄存存器器写写入入控控制制字字,设设置置采采集集指指纹纹的的参参数数,主主要要是是DCR、DTR、PGC 这这几几个个寄寄存存器器的的设设置置;查查询询等等待待,当当指指纹纹被被fps200 自自动动采采集集进进入入数数据据寄寄存存器器,把把指指纹纹数数据据存存入入到指定的存储空间。到指定的存储空间。14.6.2 14.6.2 指纹采集与处理指纹采集与处理fps200 指纹处理部分程序如下所示:/*fps200.h头文件*/#ifndef _F
39、PS200_H_#define _FPS200_H_#define ROW_NUM 300#define COL_NUM 256#define FPS200_IOCRESET _IO(FPS200_IOC_MAGIC)#define FPS_RAH 0 x00#define FPS_RAL 0 x01#define FPS_CAL 0 x02/*调试的内核空间*/#define PDEBUG(fmt,args.)printk(KERN_DEBUGfps200:fmt,#args)#else/*用户空间*/#define PDEBUG(fmt,args.)fprintf(stderr,fmt,#
40、args)#endif#else#define PDEBUG(fmt,args.)#endif#undef PDEBUGG#define PDEBUGG(fmt,args.)/*设备结构类型*/typedef struct FPS200_Dev unsigned char flag;void*data;FPS200_Dev;#define FPS200_IOC_MAGIC k#define FPS200_IOCSDTR _IOC(_IOC_WRITE,FPS200_IOC_MAGIC,1,1)#define FPS200_IOCSDCR _IOC(_IOC_WRITE,FPS200_IOC_M
41、AGIC,2,1)#define FPS200_IOCSPGC _IOC(_IOC_WRITE,FPS200_IOC_MAGIC,3,1)./*fps200.c文件*/#ifndef _KERNEL_#define _KERNEL_#endif#ifndef MODULE#define MODULE#endif#include#include#include /*printk()*/#include /*kmalloc()*/#include /*everything.*/#include /*error codes*/#include /*size_t*/#include#include /
42、*udelay()*/#include /*ioremap(),iounmap()*/#include#include#include#include#include#include fps200.h /*local definitions*/.void fps_get_image(void)int i=0;int j=0;FPS_INDEX=FPS_CTRLA;FPS_DATA=FPS_CTRLA_GETIMG;for(i=0;i300;i+)FPS_INDEX=FPS_CTRLB;while(!(FPS_CTRLB_RDY&FPS_DATA)udelay(1);for(j=0;jdata+
43、i*256+j)=FPS_DATA;int fps200_open(struct inode*inode,struct file*filp)MOD_INC_USE_COUNT;return(0);int fps200_release(struct inode*inode,struct file*filp)MOD_DEC_USE_COUNT;return(0);int fps200_ioctl(struct inode*inode,struct file*filp,unsigned int cmd,unsigned long arg)int err=0;int ret=0;unsigned ch
44、ar tmp;if(_IOC_TYPE(cmd)!=FPS200_IOC_MAGIC)return-ENOTTY;if(_IOC_NR(cmd)FPS200_IOC_MAXNR)return-ENOTTY;if(_IOC_DIR(cmd)&_IOC_READ)err=verify_area(VERIFY_WRITE,(void*)arg,_IOC_SIZE(cmd);else if(_IOC_DIR(cmd)&_IOC_WRITE)err=verify_area(VERIFY_READ,(void*)arg,_IOC_SIZE(cmd);if(err)return err;switch(cmd
45、)case FPS200_IOCSDTR:ret=_get_user(tmp,(unsigned char*)arg);if(tmp 0 x7f)tmp=0 x7f;FPS_INDEX=FPS_DTR;FPS_DATA=tmp;break;case FPS200_IOCSDCR:ret=_get_user(tmp,(unsigned char*)arg);if(tmp 0 x1f)tmp=0 x1f;FPS_INDEX=FPS_DCR;FPS_DATA=tmp;break;1、指纹图像增强、指纹图像增强(Gabor滤波法滤波法)2、指纹图像的细化、指纹图像的细化3、指纹图像的特征点提取、指纹图
46、像的特征点提取 4、指纹图像的特征匹配、指纹图像的特征匹配14.6.3 14.6.3 指纹识别算法的实现1.指纹图像增强(Gabor滤波法)。构造Gabor滤波器:float dy2=1.0/r2;float dx2=1.0/r2;float x2,y2;y2=-x*sin(phi)+y*cos(phi);x2=x*cos(phi)+y*sin(phi);return exp(-0.5*(x2*x2*dx2+y2*y2*dy2)*cos(2*pi*x2*f);用Gabor滤波器进行滤波:for(j=Wg2;j lHeight-Wg2;j+)for(i=Wg2;i lWidth-Wg2;i+)s
47、um=0.0;o=orientationi+j*lLineBytes;f=frequencei+j*lLineBytes;for(v=-Wg2;v=Wg2;v+)for(u=-Wg2;u 255.0)sum=255.0;if(sum0.0)sum=0.0;*(enhanced+j*lLineBytes+i)=(unsigned char)sum;2.指纹图像的细化。采用经典形态学细化方法,程序如下:/逐个判断条件。/判断2=NZ(P1)=2&nCount GetHDIB();/找到DIB图像象素起始位置lpDIBBits=pDoc-GetDibImage()-FindDIBBits(lpDIB
48、);LONG lWidth=pDoc-GetDibImage()-DIBWidth(lpDIB);LONG lHeight=pDoc-GetDibImage()-DIBHeight(lpDIB);LONG lLineBytes=WIDTHBYTES(lWidth*8);LPSTR lpNewDIBBits;HLOCAL hNewDIBBits;hNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight);if(hNewDIBBits=NULL)return;pNewDIBBits=(char*)LocalLock(hNewDIBBits);/初始化图像为原始图
49、像memcpy(lpNewDIBBits,lpDIBBits,lLineBytes*lHeight);LPSTR mask;HLOCAL hmask;hmask=LocalAlloc(LHND,lLineBytes*lHeight);if(hmask=NULL)return;mask=(char*)LocalLock(hmask);float*Direction;float*frequency;Direction=(float*)malloc(lLineBytes*lHeight*sizeof(float);if(Direction!=NULL)memset(Direction,0,lLine
50、Bytes*lHeight*sizeof(float);frequency=(float*)malloc(lLineBytes*lHeight*sizeof(float);if(frequency!=NULL)memset(frequency,0,lLineBytes*lHeight*sizeof(float);FvsMinutiaSet_t minutia;minutia=pDoc-GetDibImage()-MinutiaSetCreat(5000);/判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)if(pDoc-GetDibImage()-DIBNumCo