基于Android的手机签到系统
2014-07-03狄三云宋丽红
狄三云,宋丽红,张 铠
(天津财经大学理工学院信息科学与技术系,天津 300222)
0 引言
课堂考勤在高校教学管理中至关重要。传统的学生签到方式是纸质点名签到,不仅低效繁琐,占用上课时间,教务处的统计工作也极其繁重。新兴签到方式,如指纹签到等,由于教室数量多,短期内无法普及。因此,设计实现一个方便快捷、适合高校使用的签到系统迫在眉睫。
智能时代的来临让更多的人将目光转移到了手机客户端,各种手机签到系统层出不穷,例如,利用蓝牙通讯技术实现课堂签到,学生自行将个人信息发送至教师手机服务器端;基于人脸识别的手机签到系统,捕捉教室全景检测人脸数量,保存图片为佐证。然而,这些手机签到系统均存在着缺陷:1)无法保证签到信息与出勤学生的唯一对应性,达不到签到效果;蓝牙技术面向短距离通信,不能确定学生当前具体位置,无法保证学生是否出勤,也无法保证学生发送信息的准确性。2)识别效率较低;由于手机硬件及技术的限制,人脸识别的签到方式精确度较低,且人脸检测技术有着一定的识别率,统计人脸数目极有可能出错,反而加剧教师的工作量。
Android系统是一款基于Linux内核的手机智能操作系统,2007年开源后技术愈加成熟,硬件也愈加廉价,满足了签到系统技术和成本要求。Tesseract是惠普公司主持开发的OCR引擎,结合了Leptonica图像处理库,能读取各种格式的图像文件,识别出包括中文在内40多种语言的文本,自带字体训练库,也可训练自己的字体库,具有较好的识别效果。Android使用开源的、与操作系统无关的SQLite,是一款拥有独立性和安全性等诸多优点的轻量级数据库,占用资源较低,是移动操作系统存储数据的最佳选择。
本文在Android系统中基于OCR引擎Tesseract对学生证上学号信息的识别展开了研究,设计完成了手机签到系统。学生证件的照片保证了签到信息与学生的唯一对应性,Tesseract引擎在UNIV精度测试中的名列前茅则保证了识别率。
1 系统设计
1.1 系统需求
手机签到系统实现智能记录学生出勤,减轻教师和教务处统计学生考勤工作的负担。系统需要具有以下特性:
1)系统应具有良好的人机交互界面,符合用户的使用习惯,便于推广。
2)系统对学生证件的信息具有较高的识别率,方便、快捷、高效地实现学生签到。
3)教师能够方便地查看、管理学生信息,上报考勤信息。
系统由学生信息录入、签到、缺勤信息管理、考勤上报4个模块组成。用例图如图1所示。
图1 手机便捷签到系统用例图
1.2 模块设计
1.2.1 学生信息录入模块设计
学生信息录入模块的流程如图2所示。
该模块主要进行数据转换和数据库操作,教师需将班级信息文件存入手机客户端。模块功能包括导入、更新和删除班级信息表,完成手机存储卡内文件夹及文件的逐层显示,方便目标班级信息表查找及导入。
信息导入模块实现将文件中班级和学生信息按照设定字段插入SQLite数据库。
图2 学生信息录入模块顺序图
1.2.2 签到模块设计
签到模块是签到系统的核心模块,在完成学生信息录入模块中导入班级信息表功能后进行。
光学字符识别技术(简称OCR)识别方法主要可分为2类:基于结构特征的识别和基于统计特征的识别。本系统采用基于结构特征的识别,基本识别过程如图3所示。
图3 基于结构特征的OCR识别流程
系统调用为 Android提供的库是 Tess-Two,将OCR识别过程融入其中,方便为Android项目使用。Tesseract不仅支持训练功能,且拥有自己的语言包,本系统使用Tesseract提供的英文字符训练文件eng.traineddata来进行字符特征匹配。
该模块调用手机摄像功能,对学生证件上的学号信息进行捕捉,调用Tesseract类库识别学号信息,告知用户识别结果。考虑到相机的取景框太大,拍照时难免拍到多余信息,增加图像预处理负担,给识别带来一定难度,需在调用拍照功能时设置取景框大小,避免冗余信息的干扰。
签到模块基于人性化原则,在学生忘记携带证件的情况下,实现手动输入学号进行签到,流程图如图4所示。
图4 证件签到模块流程图
1.2.3 缺勤信息管理模块设计
图5是缺勤信息管理模块的顺序图。签到完成,考勤信息被记录到数据库,该模块将考勤记录按照班级和出勤情况进行分类,方便教师快速查看出勤情况。对于缺勤学生,该模块赋予教师管理缺勤情况功能:编辑缺勤原因,存入数据库;短信预警缺勤次数较多的学生,提醒出勤。
缺勤信息管理模块同时具有数据转换功能,可将缺勤信息导出手机数据库,存储到手机存储卡,以备考勤上报模块使用,实现考勤管理智能化。
图5 缺勤信息管理模块顺序图
1.2.4 考勤上报模块设计
考勤上报模块改进了传统的考勤管理方式,将传统纸质信息升级为电子信息,实现教务管理智能化。该模块导入JavaMail开发包,无须考虑邮件协议的底层实施细节,实现邮箱登录和邮件发送。
考勤上报模块允许用户登录邮箱,通过网络通信协议返回对应邮箱服务器的验证结果。验证成功,添加附件,附件是缺勤信息管理模块中导出的缺勤表,输入课程名称作为邮件标题,通过用户设定的邮箱发送邮件。验证失败,返回错误原因。
该模块需要手机访问Internet网络,为了高效,应使用WiFi或移动3G网络通信。
考勤上报模块顺序图如图6所示。
图6 考勤上报模块顺序图
1.2.5 数据库设计
本系统中主要是对数据库进行增删改查操作,以及进行数据库与文件之间的数据转换,主要包含2方面信息:班级信息和学生信息。E-R图如图7所示。
图7 手机签到系统E-R图
系统将对2个表的操作分别封装到类中,方便实现时的调用。对学生表的操作可分为:成批插入学生,删除学生,修改签到标志,添加请假原因,显示出勤或缺勤学生;对班级表的操作分为:插入班级,删除班级及班内学生信息,显示所有班级。
2 系统实现
2.1 学生信息录入模块的实现
学生信息录入模块实现了Excel表与SQLite数据库的数据转换,操作需导入JXL开发包。
点击学生信息录入模块主界面右上角的图像按钮可以进入浏览模块界面。
该界面使用ListView逐层显示手机文件系统。调用方法setOnItemClickListener为该ListView添加单击事件:将Excel表中的学生信息转存入SQLite。实现过程需创建Excel文件的输入流,通过函数Workbook.getWorkbook()得到工作簿对象,调用 getSheet()得到工作表对象,获取行列数,结合sheet.getCell()和Cell.getContents()循环取出各行各列的值存入数组,将数组存入数据库。返回主界面,弹出对话框,显示导入成功。
学生信息录入模块的主界面使用ListView显示已导入班级,每行添加“删除”按钮,并添加单击事件:删除过期班级和班内学生信息。
2.2 签到模块的实现
签到模块的主界面显示3个功能键:拍摄,签到完成和学号输入。
签到完成需在手动签到或证件签到完成后进行,根据签到形成的临时文件中的记录修改数据库中学生的签到标志。
学号输入关联手动签到模块,该模块通过Text-Box获取学生学号,点击按钮提交,在按钮单击事件中将记录添加到临时文件。
点击拍摄键进入签到的核心模块,图8所示为拍摄模块的主界面。在拍照时,该界面在中间设定有红色线条的框为取景框,绘制大小限制取景范围;设定左上角的框为前景框,根据取景框的大小绘制而成,系统是对前景框的内容进行识别。系统使用Surface-View控件和自定义的View类子控件OcrFinderView完成取景框的预览,使用ImageView控件在前景框中实时显示取景框的图像信息。
图8 拍摄模块主界面
系统预览图像时,自动调用方法 PreviewCallback.onPreviewFrame(byte[]data,Camera camera),重载该方法完成自定义处理,该方法中data参数存储预览图像的信息。重载中,使用构造函数YuvImage(data,ImageFormat.NV21,w,h,null)将 data 中的内容转换成 YuvImage对象,调用 YuvImage.compressToJpeg(Rect rectangle,int quality,OutputStream stream)将YuvImage对象转换成流,进一步形成Bitmap对象,调用自定义方法cutBitmap()截取所需内容用于前景框显示,以便识别。Tesseract的识别率取决于图片质量以及训练库的能力,需调用方法Bitmap.copy(Bitmap.Config.ARGB_8888,false)设置图片质量。
识别时,Tesseract必须有匹配库,可从官方拷贝或自己训练,系统使用官方的英文匹配库 eng.traineddata,该库通过文件操作从项目的assets文件夹输出到目录/mnt/sdcard/tessdata中。识别过程需新建 TessBaseAPI对象 baseApi,调用方法 baseApi.init(TESS_PATH,“eng”)设定匹配库的路径和语言。需要识别的Bitmap类型的图像是通过baseApi.setI-mage(bitmap)设定的,而识别结果是由 baseApi.getUTF8Text()方法根据初始化的语言获取的字符串。为了提高识别率,直接调用Leptonica接口实现图像的预处理。为提高系统的健壮性,最后必须调用baseApi.clear()释放 bitmap,释放 native内存,调用baseApi.end()结束识别。
识别完成,弹出对话框显示识别结果,如图9所示,教师点击OK功能键完成该生签到。Ok键的单击事件是将获取的证件号存入临时文件。
图9 识别结果显示界面
2.3 缺勤信息管理模块的实现
缺勤信息管理包含查看考勤信息模块和导出缺勤表模块。
查看考勤信息模块由Spinner控件和Button按钮以及ListView组成。其中,Spinner显示已导入班级供教师选择,ListView显示查询结果。2个Button分别用于显示缺勤和出勤学生信息,信息根据签到标志分类,可调用 rawQuery(sqlstr,args)将结果存储在Cursor对象,循环存入数组。
ListView添加单击事件中用LayoutInflater类动态添加显示控件,通过 getSystemService(Context.WINDOW_SERVICE)取得屏幕管理,新建PopupWindow对象,调用showAtLocation显示屏幕,为按钮添加单击事件。短信预警的实现调用系统功能Uri.parse("smsto:"+phone)设置 Uri,构造 Intent(android.content.Intent.ACTION_SENDTO,Uri)对象进行跳转。
导出缺勤表功能由Button按钮实现,按钮单击事件中使用Workbook类的工厂方法Workbook.create-Workbook()创建可写入的工作薄对象;方法Workbook.createSheet则创建可写入的工作表对象;构造Label对象,调用addCell(label)循环添加单元格到工作表中,完成导出过程。
2.4 考勤上报模块的实现
考勤上报分为邮箱登录模块和发送邮件模块。邮箱登录模块界面通过TextBox控件获取登录的用户名和密码,点击右下方“登录”按钮进行服务器验证。“登录”按钮的单击事件通过Session.getDefault-Instance()获取session对象,收集客户端与邮件服务器建立网络连接的会话信息。调用session.getTransport("smtp")获取实现SMTP协议的邮件发送对象Transport,执行 Transport.connect()与服务器创建连接,返回验证结果。
验证成功,进入发送邮件主页面,页面有两个功能按钮:添加附件和发送。使用ListView显示存储卡信息,单击事件调用自定义方法addAttachment(String filePath)实现附件的添加:创建MimeBodyPart实例,通过set系列方法设置实例属性,如MimeBodyPart.setFileName(MimeUtility.encodeText(fds.getName(),"GBK","B"))设置编码格式,使附件正常显示中文;调用addBodyPart()添加附件到MimeMultipart实例。
点击目标附件跳转至主页面,ListView显示添加结果。输入邮件主题,点击“发送”按钮,获取会话信息session对象,创建Message实例,通过Message的set系列方法设置邮件消息的内容,调用 Transport.send(Message)方法实现邮件发送。邮件发送完毕,循环调用 multipart.removeBodyPart(i)删除所有附件,释放系统资源。
3 结束语
系统在Android平台下,调用 Tesseract类库,设计实现了通过智能手机摄像头,采集证件信息,识别学生学号,记录学生考勤的应用,方便教师记录考勤,节省了课上时间,减少教务处考勤统计的工作量,实现了便捷高效的高校考勤管理系统。
本系统还可以扩展应用到企业内部员工会议、上班签到等需现场鉴别身份信息的业务中,系统不受硬件设备、空间以及预算的限制,通过智能移动终端为人们的工作和生活提供了更好的服务。
[1] 王国辉,李伟.Android开发宝典[M].北京:机械工业出版社,2012:6-19.
[2] 张志杰.智能手机操作系统的竞争与发展研究[D].北京:北京邮电大学,2012.
[3] 吴国平.数字图像处理原理[M].武汉:中国地质大学出版社,2007.
[4] 戈振兴,边静.Android体系结构剖析[J].科技信息,2011(12):609.
[5] 高峰.二维条形码手机识别系统的设计与实现[D].北京:北京邮电大学,2008.
[6] 胡伟.Android系统架构及其驱动研究[J].广州广播电视大学学报,2010,10(4):96-101.
[7] 姚昱旻,刘卫国.Android的架构与应用开发研究[J].计算机系统应用,2008,17(11):110-112.
[8] 朱虹.数字图像处理基础[M].北京:科学出版社,2005.
[9] 章毓晋.图像分割[M].北京:科学出版社,2001.
[10] Chang Shyang-Lih,Chen Li-Shien,Chung Yun-Chung,et al.Automatic license plate recognition[J].IEEE Transactions on Intelligent Transportation Systems,2004,5(1):42-53.
[11] Li Gang,Zeng Ruili,Lin Ling.Research on vehicle license plate location based on neural networks[C]//Proceedings of the 1st IEEE International Conference on Innovative Computing,Information and Control.2006,3:174-177.
[12] You Dong-Hoon,Noh Bong-Nam.Android platform based Linux kernel rootkit[C]//Proceedings of the 6th IEEE International Conference on Malicious and Unwanted Software.2011:79-87.
[13] Shi Meng,Fujisawa Y,Wakabayashi T,et al.Handwritten numeral recognition using gradient and curvature of gray scale image[J].Pattern Recognition,2002,35(10):2051-2059.
[14] Govindan V K,Shivaprasad A P.Character recognition:A review[J].Pattern Recognition,1990,23(7):671-683.
[15] Ableson F,Collins C,Sen R.Unlocking Android[M].Manning Publications,2009.
[16] Tian Jipeng,Kumar G H,Chethan H K.Chinese numeral recognition using Gabor and SVM[C]//Proceedings of the 3rd IEEE International Conference on Emerging Trends in Engineering and Technology.2010:202-206.