打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于指纹识别的考勤管理系统

基于指纹识别的考勤管理系统

第一章  绪  论 
1.1 研制背景

随着网络与通信技术的飞速发展和人类物理与虚拟活动空间的不断扩大,现代社会对于人类自身身份识别的准确性、安全性与实用性提出更高要求。传统的身份识别方法已经远远不能满足这种要求,人类必须寻求更为安全可靠、使用方便的身份识别新途径。于是,生物识别技术悄然兴起,并应运而生为一种新的身份识别技术。生物识别技术(Biometric Identification Technology)是利用人体生物特征进行身份认证的一种技术。生物特征是唯一的(与他人不同),可以测量或可自动识别和验证的生理特性或行为方式,分为生理特征和行为特征。生物识别系统对生物特征进行取样,提取其唯一的特征并且转化成数字代码,并进一步将这些代码组成特征模板,人们同识别系统交互进行身份认证时,识别系统获取其特征并与数据库中的特征模板进行比对,以确定是否匹配,从而决定接受或拒绝该人。

生物识别技术是目前最为方便与安全的识别技术,它不需要记住复杂的密码,也不需随身携带钥匙、智能卡之类的东西。生物识别技术认定的是人本身,没有什么能比这种认证方式更安全、更方便了。由于每个人的生物特征具有与其他人不同的唯一性和在一定时期内不变的稳定性,不易伪造和假冒,所以利用生物识别技术进行身份认定,安全、可靠、准确。此外,生物识别技术产品均借助于现代计算机技术实现,很容易配合电脑和安全、监控、管理系统整合,实现自动化管理。

常见的生物识别技术主要有九种:指纹、脸形、虹膜、视网膜、手写体、声音、掌纹、手形和脸部热谱图等,指纹识别是生物识别技术的一种。迄今为止,最为人们所关注、最为成熟的生物识别技术就是指纹识别。

近年来,国内外学者对自动指纹识别技术进行了深入和广泛的研究,取得了较大的进展人事考勤制度是公司管理制度的重要组成部分。员工准时出勤和公平合理的考勤管理制度影响到公司的形象、员工的士气,进而影响公司员工的工作效率、公司的经济效益。现在许多公司采用的考勤方式有:打卡钟、磁卡、IC卡、非接触式卡、ID卡等。虽然能起到一定的作用,但问题也很突出:打卡费人费事、需要好几个文员做统计和定时更换卡,而磁卡等则存在易忘带、遗失、被盗、制作新卡等问题。从根本上来说,以上考勤方法在验证员工的身份时并不是验证员工本身,而是验证物的有效性,因此存在无法避免的代打卡的可能,管理上的漏洞是先天性。

随着生物识别技术的日臻完善,市场上相继出现了识别人体生物特征的设备,比如指纹、掌形、虹膜等生物识别系统,这些高科技的出现为考勤管理更添一道保障和规范管理。综观所有生物识别考勤系统,性价比最高的还是指纹考勤系统。它应用面广,成熟,使用便利,至今在多个行业得到应用。

指纹考勤系统实现人、地、时三者合一,去除人情管理和考勤虚假,为公司省去不必要的员工加班费,对公司职员的人事出勤进行公正合理并有效、科学地管理。人体指纹有两大生物特征:人人不同和终生不变,并具有随身携带的便利性和不可仿冒的安全性,指纹生物识别技术正是利用这两大特点进行身份识别的,它具有快捷方便、准确可靠和安全保密的优点。工作人员不必保管和携带各种证件(如纸卡或IC卡等等),只要轻轻一按,就可完成身份识别。指纹考勤系统是利用人体手指生物识别技术,集成考勤软件的最先进的考勤设备[1]

1.2 课题研究的主要内容

本文的研究任务是设计基于指纹识别的考勤管理系统,并通过系统的具体实现,讨论应用系统的开发,并对系统的安全性和稳定性进行分析。

对系统所要求的指纹识别技术进行了解,主要从硬件方面和软件方面来保证系统安全稳定的运行。指纹识别技术应用最早,也最为成熟,价格成本低廉。传统的机械钥匙,“口令+密码”以及智能卡等的保护措施存在着丢失,遗忘,复制与被盗的隐患,在这种情况下指纹识别可以更好的提供用户的需求。

确定系统设计的总体方案,合理的采用指纹采集设备,建立数据库,制定出合理的考勤管理办法。

l        合理的采用指纹采集设备,其主要目的是使用指纹来登陆考勤管理系统,防止老式打卡考勤设备的找人带打卡或找人代签的弊端。

l        建立数据库,根据考勤管理系统的需求,建立完善的数据库。

l        制定出合理的考勤管理办法,主要包括出差,请假,加班等考勤方案。使得考勤细节划分明确。

1.3 本文的主要工作

目前利用指纹识别技术的应用系统常见有两种方法,即嵌入式系统和连接PC的桌面应用系统。嵌入式系统是一个相对独立的完整系统,它不需要连接其他设备或计算机就可以独立完成其设计的功能,像指纹门锁、指纹考勤终端就是嵌入式系统。其功能较为单一,应用于完成特定的功能。而连接PC的桌面应用系统具有灵活的系统结构,并且可以多个系统共享指纹识别设备,可以建立大型的数据库应用。本文的主要包括以下内容:

第二章介绍了指纹识别技术的原理,系统的分类。

第三章提出了基于指纹识别系统的设计。

第四章阐述了考勤管理系统后台数据库的设计。

第五章阐述了考勤管理系统的实现。


第二章 指纹识别的基本原理 2.1 指纹识别系统的工作原理

一般来讲,自动指纹识别算法体系大致由指纹图像采集、指纹图像预处理、特征提取、指纹分类和指纹比对几个部分组成。如图2-1所示:


 SHAPE  \* MERGEFORMAT 

图2-1 指纹识别系统框图

1)指纹图像采集

较早出现的活体指纹采集设备是光电式的,现在仍为大多数自动指纹识别系统所使用。后来出现的电容式和电感式的采集设备,在某些条件下可提高指纹采集的质量,但在耐磨性和稳定性等方面还存在一些问题。对干、湿、脏的指头或磨损严重的指纹均能可靠、正确的进行采集和尽量减少采集时的变形是指纹采集技术需要解决的主要问题。

到目前为止,光学采集头提供更加可靠的解决方案。通过改进原来的光学取像技术,新一代的光学指纹采集器更是以无可挑剔的性能与相对非常低的价格使电容方案相形见绌。

光学技术需要一个光源从棱镜反射到按在取像采集头上的手指,光线照亮指纹从而采集到指纹。光学取像设备依据的是光的全反射原理(FTIR)。光线照到压有指纹的玻璃表面,反射光线由CCD去获得,反射光的量依赖于压在玻璃表面指纹的脊和谷的深度和皮肤与玻璃间的油脂和水分。光线经玻璃射到谷的地方后在玻璃与空气的界面发生全反射,光线被反射到CCD,而射向脊的光线不发生全反射,而是被脊与玻璃的接触面吸收或者漫反射到别的地方,这样就在CCD上形成了指纹的图像。

2) 预处理

通常,指纹采集器采集到的指纹是低质量的,存在的噪声较多。通过预处理,将采集到的指纹灰度图像通过预滤波、方向图计算、基于方向图的滤波、二值化、细化等操作转化为单像素宽的脊线线条二值图像,基于此二值图像对指纹的中心参考点以及细节特征点特征等进行提取。指纹图像预处理是自动指纹识别系统基础,是进行指纹特征提取和指纹识别不可缺少的重要步骤。好的预处理方法可以使得到的单像素宽脊线线条二值图像更接近被提取者的指纹,更准确地反映被提取指纹的特征。因此可以使后续处理中提取的指纹特征更准确,特征提取更迅速[2]。指纹图像预处理的一般过程如图2-2所示。

指纹图像的预处理一般采用图像增强、二值化和细化的方法来抽取脊的骨架。这类方法受指纹图像质量的影响比较大,难以得到令人满意的结果。很多研究者提出了不同的预处理方法,这些方法是用局部脊方向和局部自适应阈值来增强指纹图像,但各自都有一些局限性。例如,用分块的方法实现局部自适应阈值并得到该块内的脊方向。这些

方法通常是分别得到骨架和方向流结构,缺乏相关性。

 SHAPE  \* MERGEFORMAT 

图2-2 预处理框图

3) 特征提取

指纹的特征点分为全局特征和和局部特征。在考虑局部特征的情况下,有学者认为,在比对时只要13个特征点重合,就可以确认是同一个指纹,对于不同的应用情况,要求匹配的特征点的个数会有所不同,如:用在公安刑侦时要求匹配特征点的个数就要比用在指纹考勤时多。指纹的细节特征可以有150种之多,但这些特征出现的概率并不相等,很多特征是极其罕见的。一般在自动指纹识别技术中只使用两种细节特征:纹线端点与分叉点。纹线端点指的是纹线突然结束的位置,而纹线分叉点则是纹线突然一分为二的位置。大量统计结果和实际应用证明,这两类特征点在指纹中出现的机会最多、最稳定,而且比较容易获取。更重要的是,使用这两类特征点足以描述指纹的唯一性。通过算法检测指纹中这两类特征点的数量以及每个特征点的类型、位置和所在区域的纹线方向是特征提取的任务。

4) 指纹分类

指纹分类的主要目的是方便大容量指纹库的管理,减小搜索空间,加速指纹匹配过程。指纹分类技术越完善,能够划分的类型越细,样本数据库每个类别中所包含的样本数量就会越少,对一次识别任务来讲,需要比对的次数和时间开销就会越少。在大部分研究中,指纹一般分为五类:漩涡型、左环型、右环型、拱型、尖拱型。对于要求严格的指纹识别系统,仅按此分类是不够的,还需要进一步更加细致的分类。

5) 指纹比对

指纹比对指的是通过对两枚指纹的比较来确定它们是否同源的过程,即两枚指纹是否来源于同一个手指。指纹比对主要是依靠比较两枚指纹的局部纹线特征和相互关系来决定指纹的唯一性。指纹的局部纹线特征和相互关系通过细节特征点的数量、位置和所在区域的纹线方向等参数来度量。细节特征的集合形成一个拓扑结构,指纹比对的过程实际就是两个拓扑结构的匹配问题。由于采集过程中的变形、特征点定位的偏差、真正特征点的缺失和伪特征点的存在等问题,即使是两枚同源的指纹,所获得的特征信息也不可能完全一样,指纹比对的过程必然是一个模糊匹配问题。

6) 可靠性问题

计算机处理指纹图像时,只是涉及了指纹有限的信息,而且比对算法不是精确的匹配,因此其结果不能保证100%准确。指纹识别系统的重要衡量标志是识别率,它主要由两部分组成:拒判率和误判率。我们可以根据不同的用途来调整这两个值,FRR和FAR是成反比的,可以用 1~1.0的数或百分比来表示。尽管指纹识别系统存在可靠性问题,但其安全性也比相同可靠性级别的“用户ID十密码”方案的安全性高得多。例如采用四位数字密码的系统,不安全概率为0.01%,如果同采用误判率为0.01%指纹识别系统相比,由于不诚实的人可以在一段时间内试用所有可能的密码,因此四位数密码并不安全,但是他绝对不可能找到一千个人去为他把所有的手指(十个手指)都试一遍。正因为如此,权威机构认为在应用中1%的误判率就可以接受。FRR实际上也是系统易用性的重要指标。由于FRR和FAR是相互矛盾的,这就使得在实际应用系统的设计中,要权衡易用性和安全性。一个有效的办法是比对两个或更多的指纹,从而在不损失易用性的同时,最大限度地提高了系统的安全性。

2.2 指纹识别系统的工作模式

自动指纹识别系统的工作模式可以分为两类:验证模式和辨识模式。

验证就是通过把一个现场采集到的指纹与一个已经登记的指纹进行一对一的比对,来确认身份的过程。作为验证的前提条件,员工的指纹必须在指纹库中已经注册。指纹以一定的压缩格式存储,并与其姓名或其标识联系起来。随后在比对现场,先验证其标识,然后,利用系统的指纹与现场的指纹比对来证明其标识是否是合法的。所以指纹考勤系统属于验证[3]。验证过程如图2-3所示:


 SHAPE  \* MERGEFORMAT 

图2-3 指纹验证过程

辨识则是把现场采集到的指纹同指纹数据库中的指纹逐一对比,从中找出与现场指纹相匹配的指纹,这也叫“一对多匹配”。辨识过程如图2-4所示:


 SHAPE  \* MERGEFORMAT 

图2-4 指纹辨识过程


第三章 指纹识别系统的设计 3.1系统功能需求

3.1.1 系统体系结构

本文所设计的指纹识别系统依托于指纹采集器和个人计算机实现对员工的考勤管理。本系统严格的按照考勤的规则和安全性来设计的,充分的考虑到不同单位的考勤制度的通用性和不同之处,指纹信息库的增大,安全性高等。在设计上基本遵循了以下几点:

l        可靠性:可靠性是整个应用系统的基础。主要从应用软件的稳定可靠和所选设备的可靠稳定两方面来保证的。

l        综合性:系统基于员工的基本信息管理,考勤方案等。主要完成采集并登记员工的指纹数据,在考勤时验证指纹身份,就可查询到员工当日的上下班时间以及一些基本信息,可以和以前的考勤管理系统在一定程度上融合为一体。

l        先进性:系统采用先进的活体指纹技术,只要第一次指纹采集的正确性。就能保证在考勤过程中的数据与人的一致,从而克服了以往考勤系统对身份验证的不足,造成企业不必要的损失。这也保证了本系统在整个考勤环节中具有先进性。

3.1.2 系统功能模块设计

基于指纹识别的考勤系统是先将员工的指纹先记录存储到指纹数据库中,员工在签到时系统会自行验证。核实当前员工的身份,之后实行当日的考勤方案。经后台管理员核实,最终显示考勤结果[4][5]

所以软件功能模块设计如图3-1所示:



图3-1软件总体功能结构图

指纹图像采集模块主要是职员进行签到时,指纹采集器对职员的指纹进行预处理,特征提取。员工上下班进行指纹登陆的数据可以作为原始考勤数据的来源,指纹采集器采集到指纹图像后,才能被计算机进行识别、处理。指纹图像的质量会直接影响到识别的精度以及指纹识别系统的处理速度,因此指纹采集技术是指纹识别系统的关键技术之一。指纹的表面积相对较小,日常生活中手指常常会受到磨损,所以获得优质的指纹细节图像是一项十分复杂的工作。

指纹比对算法模块主要对提取到的指纹特征与指纹数据库的指纹进行辩识和验证两种不同的比对算法。进而核实身份。

管理模块是供指纹管理员使用,用于设置用户信息,设置考勤参数,处理特殊考勤,备份考勤数据等。该模块允许系统管理员进行系统设置。系统设置包括每次刷卡的有效时间段设置,迟到、早退、旷工的时间设置等。该模块可以根据公司实际情况设置作息时间、定义迟到、早退、出入等考勤规则。提供多种考勤管理功能系统提供了考勤管理功能,如请假、出差、加班、考勤等。

结果统计模块是用户统计考勤数据,如按月统计职员出勤情况。统计系统将各考勤机采集到的信息进行过滤处理,只保留每天考勤记录,然后按员工姓名、部门、日期或其他分类方式进行统计。

3.2 数据流程图

职员出勤的原始记录来源于指纹识别系统,并且以固定的格式保存在数据库中,本文所说的指纹识别管理系统的主要任务是如何处理这些数据。为了用计算机对信息进行控制和管理,还必须进一步的设计出数据流程图。

在对基于指纹识别系统深入了解之后,我认为所做的数据流程图是切实可行的,同时更便于计算机管理及提供更多的辅助决策,以满足不同人的需求。

考勤系统开始运行,首先系统初始化,包括考勤时间,员工信息等系统模块一并初始。同时指纹采集器开始工作,如果没有员工进行指纹登录,则系统等待;员工使用指纹进行登录后,系统开始调用数据库中的指纹与该员工的指纹进行比对,经过比对后,如果该员工的指纹在数据库中存在,则系统显示登录成功,并显示员工信息,这时需要员工对自己的信息进行确认,系统对此时的信息进行记录,此时完成一个员工指纹登录的过程[6]

如果在比对过程中,数据库中没有该员工的指纹信息,则系统需要管理员将这个新的指纹添加到数据库中。管理员在添加新指纹的时候需要输入管理员密码对管理员身份进行核实。密码正确则可以添加当前指纹进入到指纹数据库中。

所有员工登录完成后,则退出该系统。如图3-2所示:



图3-2 指纹识别系统流程图

3.3 系统结构图

考勤系统设置如图3-3所示:


考勤人员设置

 
考勤


图3-3 系统结构图

员工信息浏览:该模块可以浏览公司员工的基本信息,可以按部门,姓名,指纹进行查询,按部门,姓名,指纹导出数据。

正常出勤:用户在该模块根据需要可以设置正常出勤规则。

上班: 在提前时间到延迟时间登录指纹有效,从提前时间到迟到范围外登录指纹为正常,迟到范围到延迟时间登录指纹算做迟到,超过延迟时间算为矿工。

下班:在提前时间到延迟时间登录指纹算正常下班。

早退:从早退设定时间到下班提前时间范围登录指纹算早退。

迟到:从迟到设定时间到延迟时间范围内登录指纹算迟到,设定时间不能大于延迟时间。

请假出差设置:该模块主要设定考勤人员的请假出差有关的日期时间资料,当员工请假出差情况下不能按时登录指纹,只有在输入请假出差资料的前提下,考勤系统才能给予请假考核,否则将按旷工处理。

3.4 系统流程图

启动系统后,员工进行登录指纹,如果登录成功则进入系统主界面,如果指纹输入有错则返回登录窗口。

员工成功登录指纹并进入考勤系统主界面中,考勤系统主界面有5个按键,分别是设置,出勤记录,统计,重新登录,退出。管理员分别使用5个不同的按键,便有5个不同的功能。

设置:管理员使用此按键后会出现上下班时间设置对话框,在这个对话框中管理员可以对一天上午,中午,下午的工作时间进行修改。已经修改的时间保存起来,下次系统将调用设置的上下班时间。

出勤记录:管理员使用此按键后会出现考勤修改对话框,管理员可以分别对“考勤修改记录”,“加班记录”,“请假记录”,“出差记录”四个页面进行编辑,编辑完成后分别把这四个页面的数据保存到数据库当中。

统计:管理员使用此按键后会出现考勤统计的对话框,管理员可以对“考勤统计”页面进行编辑,编辑完成后将数据保存到数据库中。

退出:管理员使用此按键后将会退出该系统模块[12]

考勤管理系统的系统流程图,如图3-4所示:



成功进入主界面


图3-4 系统流程图

3.5 小结

在本章节中,介绍了指纹考勤系统的总体设计,整个系统由硬件部分和软件部分组成。其中,硬件部分主要由通用的计算机,指纹采集器等组成;软件部分由前台系统和后台管理系统两大部分。其中前台系统包含指纹登记及指纹签到两大子系统;后台管理系统包含考勤管理,人事管理两大子系统。综上,主要过程为本软件对质问采集器采集的指指纹图象进行分析处理,为考勤和认识管理提供依据。本系统的系统功能主要为员工通过指纹来登陆该考勤管理系统。上班时间的设定。上下班时间的相对固定,可保存在客户端的设置文件中。员工出入单位的情况记录。出入情况主要由考勤系统来记录,但是需要设置人工添加的功能,已备特殊情况的处理,请假,加班和出差情况的记录,每个月底进行整个月的出勤情况统计。


第四章 数据库设计 4.1 数据库概述

随着数据库应用技术的发展,越来越多的软件开发人员和爱好者希望了解并掌握管理,开发数据库应用程序的方法。SQL server是微软公司推出的数据库管理系统,是当前非常流行的数据库管理系统之一,拥有较大的市场占有率和广泛的用户群体。SQL server提供了很多使用的管理和开发工具,使用它们可以方便的对数据库精心管理和维护。本文所说的指纹识别系统采用SQL server作为数据库开发工具,在系统中与数据库交互的部分均采用标准的SQL语言,这样可以提供系统的通用性,从而使后台数据库可以采用多种数据库系统,可以根据用户自己的需求来进行选择。

之所以在这里使用SQL server作为数据库系统,以为在后期的使用中指纹会越来越多,所以对数据库的要求也越高。

设计数据库时,应先确定需要什么样的表,各表中都有哪些数据以及各个表的存取权限等等。在创建和操作表的过程中,将对表进行更为细致的设计。

4.2 数据流图

出勤的原始记录主要来源于考勤机,并且以固定格式保存在数据库中。基于指纹识别管理系统的任务是如何处理这些数据。系统的数据流图如图4-1所示:

登陆指纹

 


请假出差

 
 SHAPE  \* MERGEFORMAT 

图4-1 数据流图

在本指纹考勤管理系统中,员工上下班依据指纹来识别每个员工的身份,登陆成功后,系统会记录当时员工的出勤时间,并保存出勤记录数据信息;当员工有请假出差时必须通过经理审批,经理审批通过后,考勤管理员将该员工的出差请假信息保存,另外考勤管理员也可以设置上下班的时间安排。以上各种信息经过管理员的统计导出月度员工考勤统计表。

4.3 数据需求分析

   根据数据流图,可以列出以下数据项和数据结构:

l        出勤记录:记录号,员工、出入情况和出入时间

l        月度考勤统计:记录号、员工姓名、年月、累计正常工作时间、累计请假时间、累计加班时间、累计出差时间、迟到次数、早退次数和旷工次数

l        请假记录:记录号、员工、假期起始时间/结束时间和请假缘由

l        加班记录:记录号、员工、加班时间长度和日期

l        出差记录:记录号、员工、出差起始时间/结束时间和具体描述

l        人员信息:记录号、员工指纹、密码、权限、姓名、部门和当前状态等

l        部门设置:部门编号、名称等

4.4 数据库逻辑结构设计

进行数据库设计的首要任务是考虑信息需求,也就是数据库要存入什么样的数据。当然,创建数据库并非仅仅的为了存储数据,更主要的目的是从中提取有用信息。所以除了考虑数据库存储什么数据外,还应该考虑数据的存储方式,目的,用途以及性能要求。如图4-2所示:



图4-2 数据库概念结构设计(E-R图)

4.5 数据库表的建立

表是数据库中存储数据的基本对象,它是由行和列组成,是一个二维结构的表,每行数据称为一条记录,每列数据称为一个字段。表是包含数据库中所有数据的数据库对象。表定义为列的集合,与电子表格相似,数据在表中是按行和列的格式组织排列的。每行代表唯一的一条记录,而每列代表记录中的一个域。

在本系统中需要在数据库中创建表以便保存考勤信息数据。创建一个表的最有效的方法是将表中所需的信息一次定义完成,包括数据约束和附加成分。也可以先创建一个基础表,想其中添加一写数据并使用一段时间。这种方法可以在添加各种约束,索引,默认设置,规则和其他对象形成最终设计之前,发现哪些事物最常用,那些数据经常输入。最好在创建表及其对象时预先将设计写在纸上。设计时应注意:表所包含的数据的类型;表的各列及每一列的数据类型;哪些列允许空值得;是否要使用以及何时使用约束,默认设置或规则;所需索引的类型,那里需要索引,哪些列是主键,哪些是外键。

l        部门表:包括部门编号,部门名称,部门经理,描述。

l        出差记录表:员工ID,员工信息,出差开始时间,出差结束时间,描述。

l        正常上下班时间表:员工ID,员工信息,上班时间,下班时间,原因。

l        加班表:员工ID,员工信息,工作时间,工作日期。

l        员工信息表:员工指纹,员工ID,员工姓名,权限等级,性别,出生日期,部门,工作,受教育程度,家庭住址,专业,电话号码,电子邮件地址,备注。

l        月度统计表:员工ID,年月,员工信息,工作小时,超出小时,上班天数,出差天数,迟到时间,早退时间,旷工时间。

4.6 系统思路

整个系统模块可根据功能划分为2类,考勤和管理。因为用户签到和和管理在功能上是相对独立的,用户在使用时一般不会一起使用。可以将考勤模块和管理模块分装成2个独立的应用程序,这样管理和考勤就能分开运行,同时就能十分轻松的完成考勤和管理工作了。

新型的指纹识别系统在考勤的速度和准确性上能较好的满足普通单位的考勤要求。同时因为不需要记忆输入密码,还可避免携带卡片而带来的麻烦,用户因该对新型的指纹考勤系统接受程度更快于传统的考勤系统。

设计数据库中的表时首先要为每列指派数据类型。数据类型定义了各列所允许的数据值,若要为列指派数据类型,在SQL server的基本数据类型,或基于这些系统数据类型创建自己定义的数据类型。因此,如果列中只含有数值,就可以将该列定义为数字数据类型。当多个表的列中要存储同样类型的数据,并且想确保这些列具有完全相同的数据类型,长度和为空性时,可使用用户定义数据类型。


第五章 系统实现 5.1 开发平台及系统配置

软件:Windows xp sp2、VC++6.0

硬件:PC计算机(CPU为赛扬D2.4G,内存为512MB)

      指纹识别器:中控科技指纹采集器

5.2 开始界面的制作

在设计初始截面时,我参考了许多考勤管理系统的操作界面,以下是系统登陆界面,如图5-1所示:

图5-1指纹签到窗口

此界面为系统操作的总界面,用户在此界面进行系统所需要的使用指纹进行登陆。登录成功后出现的主界面由“设置”,“出勤记录”,“统计”,“重新登录”,“退出”五个功能按钮组成。

5.3 系统主要功能实现

5.3.1 指纹图象采集功能的实现

指纹考勤系统在使用时需要注意以下几点:

l        指纹采集仪的镜头表面需保持清洁,不可太脏。避免粘附过多的汗渍、水迹、油污或灰尘等,出现这种情况时,请用干净的镜头纸或柔布等擦拭干净。避免故意用力按压和旋转挤压,并注意不要使指甲划伤镜头表面。

l        在按捺指纹时,请尽量选用质量好的指纹进行注册和识别。质量好的指纹表面无大面积的伤痕(烫伤、划伤、刀疤等)、无大面积褪皮、褶皱少、纹线清晰等。推荐使用拇指、食指、中指,指纹质量较好,并且使用起来比较方便[7][8]

l        按捺指纹时,应将手指的第一关节上的指肚(有指纹的表面)水平放置在指纹采集仪镜头的表面上,尽量使指纹的纹形中心与采集区域的中心重合,轻微用力,并使指纹尽可能多地贴近镜头,避免故意的用力扭曲,按下手指后采集区域的光线会变强,这时即可抬起手指,不可长时间的按压。

5.3.2 指纹比对算法的功能实现

指纹比对算法功能在指纹识别系统中非常重要,指纹取像为数字图像后才能被计算机识别,指纹图像的质量直接影响到识别的精度以及指纹识别系统的处理速度,这样才能更好的提高考勤的效率。

在进行指纹比对之前,一定要存在指纹数据库。建立指纹数据库,一般要采集同一枚指纹的3~5个样本,分别对这些样本进行预处理和特征抽取,由特征点间的相互位置关系确定样本图像是否两两匹配,根据特征点被匹配上的次数,确定该特征点的匹配权值,从所有样本图像中找出权值大于给定阈值的特征点,以这些特征为模板建立指纹数据库样本。对于待匹配的指纹图像,经预处理和特征提取后,形成一个坐标链码记录,根据这些特征的相互位置关系与指纹数据库中的样本做图形匹配,得到最终的识别结果[9]

指纹识别管理模块负责建立,维护,查找指纹数据库,为用户提供有关质问档案的各项基本操作,指纹数据库用语存储用户的指纹档案。在指纹比对算法方面,主要有两个概念,验证和辩识;验证也就是我们所常说的1:1算法,辩识就是1:N算法。同时对指纹比对算法还有两个重要的参数误识率和拒真率。如图5-2所示:

 SHAPE  \* MERGEFORMAT 

图5-2 指纹比对算法过程图

◆           验证,验证就是把一个现场采集到的指纹与一个己经登记的指纹进行一对一的比对,来确认身份的过程。作为验证的前提条件,指纹必须在指纹库中已经注册。指纹以一定的压缩格式存储,并与其姓名或其标识联系起来。随后在比对现场,先验证其标识,然后,利用系统的指纹与现场采集的指纹比对来证明其标识是合法的。这是应用系统中使用得较多的方法。

◆           辨识,辨识则是把现场采集到的指纹同指纹数据库中的指纹逐一对比,从中找出与现场指纹相匹配的指纹,也叫“一对多匹配”。

◆           误识率和拒真率由于计算机处理指纹时,只是涉及了指纹的一些有限的信息,而且比对算法并不是精确匹配,其结果也不能保证100%准确。指纹识别系统的特定应用的重要衡量标志是识别率。主要由两部分组成,拒真率和误识率。我们可以根据不同的用途来调整这两个值,拒真率和误识率是成反比的,用百分比来表达这个数[10][11]

指纹比对代码实现:

BOOL CZKFPEngX::VerFinger(VARIANT* regTemplate, const VARIANT& verTemplate, BOOL ADoLearning, BOOL* ARegFeatureChanged)

{

BOOL result;

     static BYTE parms[] =VTS_PVARIANT VTS_VARIANT VTS_BOOL VTS_PBOOL;

InvokeHelper(0x8, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms,

        regTemplate, &verTemplate, ADoLearning, ARegFeatureChanged);

return result;

}

void CDemoDlg::OnOnCaptureZkfpengx2(BOOL ActionResult, const VARIANT FAR& ATemplate)

{

  long fi;

  long Score, ProcessNum;

  BOOL RegChanged;

  char buffer[80];

  SetDlgItemText(IDC_EDHint, "取得指纹特征模板");         

  if (FMatchType == 1){

     if (m_zkfp.VerFinger(&FRegTemplate, ATemplate, FALSE, &RegChanged))

        MessageBox("指纹比对成功!");

     else

        MessageBox("指纹比对失败!");

  }     

else if (FMatchType == 2)

{  //1:N

            Score = 8;

            fi = m_zkfp.IdentificationInFPCacheDB(fpcHandle, ATemplate, &Score, &ProcessNum);

         if (fi == -1)

            MessageBox("指纹比对失败!");

            else{

               sprintf(buffer, "指纹比对成功!Name = %s Score = %d  Processed Number = %d", FFingerNames[fi], Score, ProcessNum);

           MessageBox(buffer);

            }

     }  

}

5.3.3 系统管理功能的实现

员工通过指纹,登陆成功后,则进入考勤管理系统,进行考勤管理。

图5-3 考勤管理主页图

图5-3中的“设置”实现代码如下:

void CXieyuyingDBDlg::OnBtnConfig()

{

    CWorkplanDlg dlg;

    dlg.DoModal();}

图5-3中的“出勤记录”代码实现如下:

void CXieyuyingDBDlg::OnBtnRecord()

{

    if(!m_pAttDlg) // 指针为空,创建对话框

    {  m_pAttDlg=new CAttDlg();

           m_pAttDlg->Create(IDD_DLG_XieyuyingDB, this);

           m_pAttDlg->ShowWindow(SW_SHOW);}

    else // 对话框已创建

           m_pAttDlg->ShowWindow(SW_SHOW); // 显示窗口}

管理员可以对考勤管理系统的考勤时间进行设置,修改等权限。考勤时间设置的界面如图5-4所示:

图5-4 上下班时间设置图

上下班时间对话框在系统中以模态对话框形式弹出,因此在没有退出此对话框时,所有其他的窗口都无法使用。上下班的时间包括两对时间值,可根据需要设置。最后单击“修改”按钮。单击“恢复默认设置”按钮,系统会用程序中默认的时间来代替。

图5-4中的“修改”实现代码如下:

void CWorkplanDlg::OnWorkplanModify()

{

       CString strFileName=".\\workplan.ini"; // INI文件名

       UpdateData(); // 更新数据

       WritePrivateProfileString("WorkPlan", "Time1",

              m_Time1.Format("%H:%M:%S"), strFileName);

       WritePrivateProfileString("WorkPlan", "Time2",

              m_Time2.Format("%H:%M:%S"), strFileName);

       WritePrivateProfileString("WorkPlan", "Time3",

              m_Time3.Format("%H:%M:%S"), strFileName);

       WritePrivateProfileString("WorkPlan", "Time4",

              m_Time4.Format("%H:%M:%S"), strFileName);

       WritePrivateProfileString("WorkPlan", "书名",

              m_wenben, strFileName);}

点击图5-3中的“出勤记录”会出现考勤修改对话框。

考勤修改界面如图5-5所示:

图5-5 考勤修改图

考勤修改窗口包括4项记录修改功能,分别对应出勤记录,加班记录,请假记录和出差记录。系统实现了对员工的考勤操作:主要是针对某一个员工在其需要考勤的进段进行考勤,记录其某一个时段的考勤状况,并对考勤操作留下来的数据进行管理。对员工的加班操作:主要是记录某一个员工开始加班时间和结束加班时间,并根据这两个时间数值计算出其加半时长,同时也对加班操作留下来的数据进行管理。

这4项记录的显示使用同一个检索条件。检索条件包括时间范围和员工,可根据需要设置。出勤记录的添加是为了防止考勤出故障时,保证记录的完整性,在批量输入时,进度条会显示当前完成的进度。在出勤记录列表的上方有两个按钮。一个用来删除当前的记录,另一个用来激活检索条件。考勤修改对话框中其他三项记录的添加和修改基本与出勤记录类似。

 “添加出勤修改记录”界面如图5-6所示:

图5-6 添加出勤修改记录图

图5-6中“按条件检索”实现代码:

void CPage1::OnBtnSeekio()

{  CXieyuyingDBRS rs(&db); // 构造出勤记录表

       CAttDlg *pDlg; // 指向包含本对象的CAttDlg的指针

       CString strFilter; // 用于保存过滤字符串

       CString strSTime,strETime; // 起始,结束时间

       pDlg=(CAttDlg*)GetParent()->GetParent(); // 得到指针

       pDlg->UpdateData(); // 更新数据

       strSTime=pDlg->m_StartTime.Format("%Y-%m-%d");

       strETime=pDlg->m_EndTime.Format("%Y-%m-%d");

       if(pDlg->m_bSeekbyperson) // 判断是否根据员工号检索

              strFilter="PERSON='" + pDlg->m_strPersonID + "'"; // 添加过滤条件

       if(pDlg->m_bSeekbytime) // 判断是否有时间范围

{      if(strFilter.GetLength()>0) // 判断是否已有过滤条件

                     strFilter += " and "; //如果是,需要添加and连接符

              strFilter += "IO_TIME>'" + strSTime + "'"; // 添加开始时间过滤

              strFilter += " and IO_TIME<'" + strETime + "'"; }

       if(strFilter.GetLength()>0) // 判断是否有过滤条件

              rs.m_strFilter=strFilter; // 设置Filter

       UpdateList(rs); }

“加班记录”运行界面如图5-7所示:

图5-7 加班记录图

图5-7中“添加”实现代码如下:

void CPage2::OnBtnOvertimeAdd()

{  

       int counter; // 用于保存计数

       CCounterRS rs_counter(&db); // 构造计数器记录表

       UpdateData(); // 更新数据

       if(m_strPersonName.IsEmpty()) return; // 判断员工号是否正确

       rs_counter.m_strFilter = "ID='O'"; // 设置过滤器,提取计数值

       rs_counter.Open(); // 打开计数器记录表

       counter=rs_counter.m_COUNTER_VALUE; // 提取计数值

       counter++; // 计数值加1

       rs_counter.Edit(); // 编辑计数器

       rs_counter.m_COUNTER_VALUE=counter; // 保存当前计数

       rs_counter.Update(); // 提交修改

       rs_counter.Close(); // 关闭计数器记录表

       COvertimeRS rs_overtime(&db); // 构造加班记录表

       rs_overtime.Open(); // 打开表

       rs_overtime.AddNew(); // 新增一项记录

       rs_overtime.m_ID=counter;

       rs_overtime.m_PERSON=m_strPersonID;

       rs_overtime.m_WORK_HOURS=m_nHour;

       rs_overtime.m_WORK_DATE=m_Date;

       rs_overtime.Update(); // 更新数据库

       rs_overtime.Close(); // 关闭加班记录表

       UpdateList(rs_overtime); // 更新列表框

}

图5-7中“保存”实现代码如下:

void CPage2::OnButton1()

{

CString strFileName=".\\workplan.ini"; // INI文件名

       UpdateData(); // 更新数据

//CString m_cList;

CString str1,str2,str3,str4;

       str1 = m_cList.GetItemText(0, 0);

       WritePrivateProfileString("WorkPlan", "书名",

              str1, strFileName);

       str2 = m_cList.GetItemText(0, 1);

       WritePrivateProfileString("/tWorkPlan", "书名",

              str2, strFileName);

       str3 = m_cList.GetItemText(0, 2);

       WritePrivateProfileString("WorkPlan", "书名",

              str3, strFileName);

       str4 = m_cList.GetItemText(0, 3);

       WritePrivateProfileString("/tWorkPlan", "书名",

              str4, strFileName);   }

“请假记录”运行界面如图5-8所示:

图5-8 请假记录图

 图5-8中“添加”实现代码如下:

void CPage3::OnBtnLeaveAdd()

{

       int counter; // 用于计数

       CCounterRS rs_counter(&db); // 构造计数器记录表

       UpdateData(); // 更新数据,记录编号

       rs_counter.m_strFilter = "ID='L'"; // 设置过滤器,提取计数值

       rs_counter.Open(); // 打开计数器记录表

       counter=rs_counter.m_COUNTER_VALUE; // 提取计数值

       counter++; // 计数值加1

       rs_counter.Edit(); // 编辑计数器

       rs_counter.m_COUNTER_VALUE=counter; // 保存当前计数

       rs_counter.Update(); // 提交修改

       rs_counter.Close(); // 关闭计数器记录表,添加记录

       int nYear,nMonth,nDay,nHour,nMinute; // 年,月,日,时,分

       sscanf(m_strSTime.Left(4), "%d", &nYear); // 得到年

       sscanf(m_strSTime.Mid(5,2), "%d", &nMonth); // 得到月

       sscanf(m_strSTime.Mid(8,2), "%d", &nDay); // 得到日

       sscanf(m_strSTime.Mid(11,2), "%d", &nHour); // 得到时

       sscanf(m_strSTime.Mid(14,2), "%d", &nMinute); // 得到分

       // 得到起始时间

       CTime S_time(nYear,nMonth,nDay,nHour,nMinute,0);

       // 转换结束时间类型

       sscanf(m_strETime.Left(4), "%d", &nYear); // 得到年

       sscanf(m_strETime.Mid(5,2), "%d", &nMonth); // 得到月

       sscanf(m_strETime.Mid(8,2), "%d", &nDay); // 得到日

       sscanf(m_strETime.Mid(11,2), "%d", &nHour); // 得到时

       sscanf(m_strETime.Mid(14,2), "%d", &nMinute); // 得到分

       // 得到结束时间

       CTime E_time(nYear,nMonth,nDay,nHour,nMinute,0);

       CLeaveRS rs_leave(&db); // 构造请假记录表

       rs_leave.Open(); // 打开请假记录表

       rs_leave.AddNew(); // 追加请假记录

       rs_leave.m_ID=counter;

       rs_leave.m_PERSON=m_strPersonID;

       rs_leave.m_START_TIME=S_time;

       rs_leave.m_END_TIME=E_time;

       rs_leave.m_REASON=m_strReason;

       rs_leave.Update();

       rs_leave.Close(); // 关闭请假记录表

       UpdateList(rs_leave); // 更新列表框}

“出差记录”运行界面如图5-9所示:

图5-9 出差记录图

5.3.4 考勤结果分析功能的实现

系统管理员可以通过此模块对任意时间的考勤结果进行统计。考勤统计对话框分别为月度统计,检索条件和记录列表3部分。月度统计需要设定统计的时间范围。同样,进度条将显示统计的进度。检索条件和“检索”按钮用于快速定位录,便于查询和修改。点击统计会出现考勤统计对话框,如图5-10所示:

图5-10 考勤统计图

图5-10中的“统计”实现代码如下:

void CStatDlg::OnStatBtnStat() {

      CRecordset rs_Q_attend(&db); // 构造Q_attend记录集

      CRecordset rs_Q_leave(&db);  // 构造Q_leave记录集

      CRecordset rs_Q_errand(&db);  // 构造Q_errand记录集

      CTimeSpan tp_1(1,0,0,0); // 构造一个1天的CTimeSpan

      CTimeSpan tp_02(0,2,0,0); // 构造一个2小时的CTimeSpan

      CTimeSpan TimeSpan[4]; // 保存上下班时间

      int nHours[2]; // 保存上下午工作时间

      CString strSTime,strETime; // 保存始末时间

      CTime TimeStamp, LateTime, EarlyTime,WorkStart,WorkEnd; //判断时间

      int nWorkHour,nOverHour,nLeaveHDay,nErrandHDay; // 保存时间间隔长度

      BOOL bLate,bEarly,bAbsent,bLeave,bErrand; // 保存判断结果

      int nLateTimes,nEarlyTimes,nAbsentTimes; // 保存次数

      CString cstr[4]; // 暂存起始时间

      char str[4][9]; // 暂存起始时间

      int i,j,n,counter; // 用于循环和计数

      CString strTmp,strTmp1,strTmp2; // 临时变量

      // 临时变量,年,月,日,时,分,秒

      int nHour,nMinute,nSecond;

      CString strFileName=".\\workplan.ini"; // INI文件名

      UpdateData(); // 更新数据

      GetPrivateProfileString("WorkPlan", "Time1", "08:00:00", str[0], 9, strFileName);

      GetPrivateProfileString("WorkPlan", "Time2", "12:00:00", str[1], 9, strFileName);

      GetPrivateProfileString("WorkPlan", "Time3", "14:00:00", str[2], 9, strFileName);

      GetPrivateProfileString("WorkPlan", "Time4", "18:00:00", str[3], 9, strFileName);

      for(i=0; i<4; i++) cstr[i]=str[i];

             CTimeSpan *pTS;

      for(i=0; i<4; i++)

      {

             sscanf(cstr[i].Left(2), "%d", &nHour);         // 得到时

             sscanf(cstr[i].Mid(3,2), "%d", &nMinute);   // 得到分

             sscanf(cstr[i].Mid(6,2), "%d", &nSecond);   // 得到秒

                           pTS=new CTimeSpan(0,nHour,nMinute,nSecond);

             TimeSpan[i]=*pTS; // 赋值

             delete pTS; }

      nHours[0]=(TimeSpan[1]-TimeSpan[0]).GetTotalHours(); // 计算上午工作时间

      if((TimeSpan[1]-TimeSpan[0]).GetMinutes()>30) nHours[0]++; // 四舍五入

      nHours[1]=(TimeSpan[3]-TimeSpan[2]).GetTotalHours(); // 计算下午工作时间

      if((TimeSpan[3]-TimeSpan[2]).GetMinutes()>30) nHours[1]++; // 四舍五入

      strSTime=m_STime.Format("%Y-%m-%d");

      strETime=(m_ETime+tp_1).Format("%Y-%m-%d");

      CPersonRS rs_person(&db); // 构造员工表

      rs_person.m_strFilter="STATE='T'"; // 设置过滤器,提取员工列表

      rs_person.Open(); // 打开员工表

      n=rs_person.GetRecordCount(); // 记录员工人数

      i=0; // 初始化已处理员工人数

      m_cProgress.SetRange(0,n); // 设置进度条

      m_cProgress.SetPos(0); // 初始化进度条

   while(!rs_person.IsEOF())

{

 // 依次对每个员工进行统计 详细实现见代码

}

      rs_person.Close(); // 关闭员工表

      CStatRS rs_stat(&db); // 构造统计数据表

      UpdateList(rs_stat); // 更新列表框

}

考勤管理界面及彩旦选择模块为系统提供美观,清晰的操作界面,方便了操作人员。此模块同时通过对人员的不同权限设置使具有相关权限的人员做与之相对应的工作,确保系统的安全性和人员身份的真实性。


第六章 系统测试 6.1 测试的目的

主要是对系统进行功能测试,测试系统是否完成任务说明书中的功能,保障系统在交付使用前能满足用户的要求,实现用户要求的所有功能,确保软件的质量和可用性。

6.2 用例测试

由于本系统前台部分无任何关联部分,因此分模块地进行功能测试,且采用路径覆盖方式。

1)员工登录模块

系统存在有指纹,密码为123的员工。利用指纹登录系统。

登录系统部分(表6-1)

表6-1员工登录测试用例

用例

指纹

密码 

预期输出

1

------

请输入指纹

2

-------

  空   

请输入密码

3

指纹2

123 

用户名或密码错误

4

指纹1

1234

用户名或密码错误

5

指纹1

123

成功登录系统

2)考勤管理模块

表6-2加班记录测试用例

用例

姓名

正常下班时间

考勤情况

1

 空

没有加班

2

 超过下班时间

系统错误

3

 超出下班时间

员工加班


表6-3出差记录测试用例

用例

姓名

出差时间

考勤情况

1

 空

没有出差

2

 出差时间段

系统错误

3

 出差时间段

员工出差

表6-4 请假记录测试用例

用例

姓名

正常工作时间

考勤情况

1

 空

没有请假

2

 无上班时间记录

系统错误

3

 无上班时间记录

员工请假

6.3 测试结果

根据测试用例对本系统进行测试,测试出来结果跟预期结果一样,说明本系统达到了预期的功能要求。在软件的功能实现上面已经达到了要求,但是对数据输入的验证存在问题。建议的改进:引入更多的数据验证代码和服务器端的数据验证代码。所以软件在能力上已经达到了要求。限制方面最主要的是对输入数据的限制,也就是说用户尽量输入符合规范的数据。

对输入的界面、方式以及验证在后面可以慢慢修改。功能已经完成并有一定的纠错能力可以使用。


结  论

指纹考勤系统根据指纹的唯一性来识别身份,本论文设计并实现了基于指纹识别的考勤管理系统。主要完成了以下几个方面的工作:

l        指纹比对是管理系统的关键技术,本论文利用已有指纹比对算法,实现了指纹比对功能模块。

l        在实际工作中利用指纹的唯一性,使用户通过指纹登录此系统,与传统的考勤系统相比,提高了考勤的效率。

l        本系统实现了对考勤方案进行设置,例如修改加班、请假、出差记录、及时输出考勤统计的报表等等。

在本次设计的开发过程中还存在以下问题:

l        指纹比对。指纹识别技术的一次性通过率比较低,往往会因此出现“拒真”的现象,需要多次检测才能通过,需要采用新的比对算法来提高通过率。

l        新安装系统运行的时候页面会出现乱码。通过手工修改系统配置,可较好的解决了问题。

l        考勤方案设置太少,不能够满足更详细的需求,这点可以通过增加员工的属性来细化考勤方案。

通过修改数据库设计,不仅存储员工的指纹特征信息,还可以存储的其他电子档案,形成全过程的系统管理,从而提高企业的管理效率。以上几点都是本设计以后的改进方向和研究方向。


致  谢

四年的学习生活匆匆即逝,在即将离开学校之际,我要对那些关心过我、支持过我的人表达我深深地谢意。

在完成本次学士论文的研究工作之际,我衷心的向我的导师**老师表示最诚挚的谢意!导师对论文的研究方向,研究内容,学术思想方面给予了我细心知道和严格要求。导师渊博的知识和开阔的思路,使我深受启迪。并且导师严谨的治学态度,细致的工作作风为我树立的良好的榜样。**鼓励我们说出自己见解的培养方式,增强了我逻辑表达能力,改变了我不主动与人交流的性格,使我受益终生。感谢在我大学学习生活期间给予我学习上的帮助和教导,并不断的知道和鼓励我对课题的研究工作。

大学四年生活我最感谢我的父母,他们的支持和鼓励是我坚实的后盾,我的每一步成长都离不开他们的无私奉献和温暖关怀。感谢他们对我做出的牺牲,让他们一生幸福是我前进的最大动力,我会继续努力

最后,感谢在百忙之中抽出时间审阅此文的各位老师。


参考文献

[1] 奚建荣.基于局域网的指纹考勤系统的设计与实现[J].电子学报,2002,30(11):1923-1927.

[2] 段少雄,田捷.高效指纹考勤系统的研究与实际[J].电子学报,2002,31(9):1120-1125.

[3] 苏谚华.Visual C++数字图象识别技术典型案例[J].软件学报,2003,14(6):134-138.

[4] 刘浩.Visual C++与SQL server数据库应用系统开发与实例[M].北京:电子工业出版社,2004:15-45.

[5] 胡达.基于指纹识别系统的应用开发技术[J].广西科学院学报,2001,12:42-47.

[6] 王宝元.考勤管理系统[J].计算机工程与应用,2002年,25(11):67-72.

[7] 黄少龙.指纹取像与指纹识别[J].计算机工程与应用,2003,38(16):92-98.

[8] 苏鹏.改进的指纹细节特征提取算法[J].中国图像学报,2002,7(12):89-94.

[9] Lin Hong Wan,Yi- fei Jain. A Fingerprintimage enhancement:algorithm and performance evaluation[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1998,20(8):777~789.

[10] Xiping Luo, Jie Tian and Yan Wu. A Minutia Matching Algorithm in Fingerprint Verification[J].IEEE Transactions on Pattern Analysis and Machine Intelligence, 1997 ,19(1):432-442.

[11] Yang-Koo Kang.Moon-Hyun Kim. Real-Time Fingerprints Recognition Mechanism-based on Digital Contents Protection System for Interaction on the Web[J]. Pattern Recognition,1989,22 (4):381–385.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
电路图24
指纹打卡机怎么作弊
智能会议签到系统
得意音通:“听声辩人”的践行者
矿用虹膜识别考勤安全系统
人体生物特征的比较与应用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服