搜索
您的当前位置:首页正文

基于Android平台的车辆信息查询系统的开发

来源:抵帆知识网


武汉理工大学

毕业设计(论文)

基于Android平台的车辆信息查询系统

的开发

学院(系):计算机科学与技术学院 专业班级:计算机科学与技术专业0806班 学生姓名:张方纪 指导教师:杨青

武汉理工大学毕业设计(论文)

学位论文原创性声明

本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包括任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。

作者签名: 年 月 日

学位论文版权使用授权书

本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士论文评选机构将本学位论文的全部或部分内容编入有关数据进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

本学位论文属于1、保密囗,在 年解密后适用本授权书

2、不保密囗。

(请在以上相应方框内打“√”)

作者签名: 年 月 日 导师签名: 年 月 日

2

武汉理工大学毕业设计(论文)

武汉理工大学本科生毕业设计(论文)任务书

学生姓名 张方纪 专业班级 计算机0806 指导教师 杨青 工作单位 武汉理工大学 设计(论文)题目:

基于Android平台的车辆信息查询系统的开发

设计(论文)主要内容:

开发一个“车辆信息查询系统”(简称系统)。该系统运行于手机,基于android平台;内嵌车辆信息数据库(或连接后台服务器端数据库),以及车牌识别技术。数据库中记录了相关车辆的车牌号、车型、VIN码(车架号)、车主姓名、联系电话、性别、年龄、驾照号等。

系统可用于小区车辆管理,或Taxi管理等应用领域。主要功能包括:1)车牌号输入,2)车牌拍照及车牌识别,3)根据车牌号查询车辆信息,比如车主及联系电话,4)车辆信息的浏览和查询,5)嵌入式数据库与服务器端数据库的同步。其中,功能1)2)3)是必须的最小功能集合。

论文研究工作的主要支持环境: 1)Java开发环境,如Eclipse 2)Android SDK

要求完成的主要任务:

1.学习并运用相关技术和工具,独立完成本软件系统的设计与实现。系统应能在实际环境(android手机)或PC模拟环境中运行,满足功能和性能方面的需求。 2.按学校论文格式规范撰写学士论文。完成相关英文资料的翻译(不少于5000汉字)。学生提交论文和翻译资料的同时,上交存放有论文和所设计软件源代码的光盘片。 3.要求遵守毕业设计的纪律,每周与指导老师至少联系一次,以介绍有关设计进展,并认真填写毕业设计日志。

参考资料:

1. http://developer.android.com/index.html,(Android开发者,Android开发官方网站,包括对Android

的基本知识,API文档等) 2. http://stackoverflow.com/,(包含大量有关Android开发的高质量提问与回答贴子) 3. http://code.google.com,谷歌代码搜索

指导教师签名 系主任签名 院长签名(章)_____________

3

武汉理工大学毕业设计(论文)

武汉理工大学本科学生毕业设计

(论文)开题报告

1、目的及意义(含国内外的研究现状分析) 1.1 毕业设计的目的 毕业设计课题“基于Android平台的车辆信息查询系统的开发”,从过程和结果两个角度来看,包含以下两点意义: 1.1.1 过程——接触前沿技术,综合所学知识,提升专业素养 Android系统是最近几年才诞生的一个的全新的、基于Linux和嵌入式平台的现代操作系统。它由搜索引擎巨头Google所引导,一整套开发工具及文档免费可用,集成Google云服务(Gmail、语音搜索等),有完整的生态链,获得了世界范围内广泛而巨大的市场和支持,其上的应用渗入到了我们生活的方方面面。 Android基于Java,有与Java相同的语法和类似的开发方式(ADT+Eclipse)及运行机制(Android虚拟机),并专为移动设备(有低功耗,多传感器,存储和计算性能受限等特性)定制。做Android应用开发,了解Android应用从需求分析与设计,到总体设计,到详细设计,到编码与测试,到最后的部署、维护、营销、升级等等,是对本专业所学知识的一个大的融会贯通,更是对吸收新知识、创新与营销等能力的一个大的锻炼。 车牌识别技术是本课题的重难点。图像识别、语音识别对于本人来说是从未接触过的技术,同时也是充满挑战性的。通过查阅文献、参考成熟系统等手段,自学相关知识,加上吸收与再创新,是可以取得相当的成绩的。集成创新,将已有技术应用到新的平台和领域,在这里显得尤为重要。 基于Android平台的管理信息系统,在继承传统桌面MIS系统的应用模式外,有其独特的性质,比如C/S与B/S模式的结合,设备与服务器的数据同步,又如新的用户界面、交互方式等的设计,再如地理位置等传感器信息的合理利用等。这些都值得思考与研究。 1.1.2 结果——开发出可用甚至先进的真实系统,应用于生产实践 本课题基于实现的应用需求——拥有车牌识别功能的手机车辆信息查询应用。应用涉及小区车辆管理、开放停车场车辆管理、道路黑的管理等诸多领域。如果做得好,可基于本课题成立一个项目,开发出真实可用的系统来。

4

武汉理工大学毕业设计(论文)

1.2 毕业设计的意义 1.2.1 学术意义 培养新知识获取与整理的能力(文献、文档的阅读与翻译),锻炼软件工程素养(涉及软件工程的各个阶段),研究与发展车牌识别技术,等等。 1.2.1 实用意义 做一个真实可用的系统,应用于生产实践。 2、基本内容和技术方案 2.1 基本内容 2.1.1 课题要求 开发一个“车辆信息查询系统”(简称系统)。该系统运行于手机,基于android平台;内嵌车辆信息数据库(或连接后台服务器端数据库),以及车牌识别技术。数据库中记录了相关车辆的车牌号、车型、VIN码(车架号)、车主姓名、联系电话、性别、年龄、驾照号等。 系统可用于小区车辆管理,或Taxi管理等应用领域。主要功能包括:1)车牌号输入,2)车牌拍照及车牌识别,3)根据车牌号查询车辆信息,比如车主及联系电话,4)车辆信息的浏览和查询,5)嵌入式数据库与服务器端数据库的同步。其中,功能1)2)3)是必须的最小功能集合。 2.1.2 课题分析 2.1.2.1场景或领域 1) 小区车辆管理。小区保安对占位车进行拍照(有识别和登记两大作用)。如果识别出该车为小区内的车,则可联系车主处理,否则加入黑名单。 2) 开放停车场车辆管理。开放停车场(广场式,无固定出入口,难以设置门禁),工作人员对入场车进行拍照,开始计费;车出场时进行拍照(简单比对即可匹配入场车)停止计费。 3) 道路黑的管理。路上交警跟踪可疑计程车,根据车牌号查询该车之前的照片和车主电话,通过照片对比和询问合法车主现在何处,即可判断该车是否为黑的。 2.1.2.2摘要(对课题要求的精化) 一个车辆信息查询系统。运行于手机,利用手机随时随地可用的特点(保安和执勤人员有随时到现场处理车辆相关事件的需求);提供提供拍照、录音和触屏三种车牌号输入

5

武汉理工大学毕业设计(论文)

方式,前两种还能自动识别出车牌号并提供快捷修正功能;存档拍照与录音,以及所识别的车牌号、当时的日期时间和地理位置;根据车牌号快速查询车辆信息和历史记录;在本地获取和存储数据,在有网络连接(特别是Wi-Fi)的情况下将本地与服务器数据进行同步。 2.1.2.3关键词及备注  车牌字符集:  普通车牌:蓝底白字。由省份简称(汉字),地区代码(字母)和五位号码(数字)组成,样式为“某A12345”。  机动车牌:黄底黑字。式样与普通车牌相同。  其他车牌(驾校教练车车牌/警车车牌/涉外车牌/领事馆车辆车牌/军车车牌/港澳台地车牌)暂不考虑。  语音文本识别:范围为车牌字符集。讲出车牌号,可要求重复一次。通过语音识别技术得出所识别车牌号。  图像文本识别:范围为车牌字符集。拍摄车辆全图,要求包含足够清晰的车牌号。通过图像识别技术得出所识别车牌号。  所识别车牌号:由语音或图像识别出的车牌号,用颜色和百分数显示每一个字符的确定度,可单独修正每一个字符(给出候选字符)。  车牌识别:语音文本识别和(或)图像文本识别。可将语音识别与图像识别相结合,如在拍照时说出所见的车牌号(这也保证了所拍车牌号足够清晰)。  本地和网络存储:网络服务环境的构建。  同步:将本手机所获取的最新数据上传到服务器;将服务器上的最新数据(包括由其他类似手机采集的数据)下载到本地。版本控制技术。 2.2 技术方案 通过以下几点技术方案(路线)达到本课题要求: 1) 关于车牌识别技术: a) 阅读国内外核心文献至少十篇,整理重要的内容,充分吸收; b) 获取并研究示例代码,了解技术实现; c) 尝试发现开源或没有版权争议的技术,加以改进与定制,应用到本课题。 2) 关于车辆信息查询系统: a) 设计用户及场景,设身处地地为用户着想,分析与设计需求;

6

武汉理工大学毕业设计(论文)

b) 试用已有的类似的商业软件,从中提取需求; c) 获取并研究类似应用的设计文档,学习好的做法; d) 使用软件工程的方法,文档驱动,用例驱动,测试驱动; e) 先做一步的原型,不断优化,不断拓展,组建构建一个功能足够强的、实现可用的系统。 3、进度安排 课程设计从第1周(2012年2月13日)开始,到第16周(2012年5月28日)迎接答辩,对共计15周的时间,依照学校规定并结合自身实际情况,作出如下初步安排: 第1至3周:选题,查阅文献,研究已有系统,初步把握技术路线,初步理解系统轮廓; 第4至8周:文献精读,掌握所需知识并有一定深度的理解;需求精化,已经开发出相对成熟的原型;已经相对前人有了突破方向; 第9至15周:已完成软件开发,所开发应用实用可靠,具备一定的市场价值;已经完成毕业论文,文中较好地陈述了课题的研究成果;已准备好毕业答辩。 4、指导教师意见 指导教师签名: 年 月 日 注:1.开题报告应根据教师下发的毕业设计(论文)任务书,在教师的指导下由学生独立撰写,在毕业设计开始后三周内完成。

2.“设计的目的及意义”至少800字,“基本内容和技术方案”至少400字。进度安排应尽可能详细。

3.指导教师意见:学生的调研是否充分?基本内容和技术方案是否已明确?是否已经具备开始设计(论文)的条件?能否达到预期的目标?是否同意进入设计(论文)阶段。

7

武汉理工大学毕业设计(论文)

目 录

目 录 .................................................................................................................................................................. 8 摘 要 ................................................................................................................................................................ 10 Abstract ...............................................................................................................................................................11 1

绪论 ............................................................................................................................................................ 12 1.1

1.2 2

2.1 2.2

问题描述与项目动因 .................................................................................................................... 12 篇章结构 ........................................................................................................................................ 13

Android移动操作系统 ............................................................................................................................. 14 移动计算 ........................................................................................................................................ 14 Android技术背景 ......................................................................................................................... 14 2.2.1 Android的特性 ................................................................................................................. 14 2.2.2 Android架构 ..................................................................................................................... 15 2.3 Android平台本地应用的开发 ..................................................................................................... 16

2.3.1 虚拟机之上的Java应用 .................................................................................................. 16 2.3.2 Linux之上的C/C++本地代码 .......................................................................................... 16 2.4 Android平台数据的存储与同步 ................................................................................................. 17

2.4.1 嵌入式关系数据库管理系统SQLite ............................................................................... 17 2.4.2 Android平台的数据同步 ................................................................................................. 19

3 Android平台上的车牌识别 ..................................................................................................................... 20 3.1

图像处理 ........................................................................................................................................ 20 3.1.1 OpenCV ................................................................................................................................ 20 3.1.2 JavaCV ................................................................................................................................ 20 3.2 车牌探测 ........................................................................................................................................ 21

3.2.1 将原始图像转化为灰阶图像 ............................................................................................ 22 3.2.2 灰阶图像的平滑与增强处理 ............................................................................................ 22 3.2.3 灰阶图像转化为二值图像 ................................................................................................ 22 3.2.4 从二值图像中提取轮廓 .................................................................................................... 23 3.2.5 基于边缘检测的车牌探测 ................................................................................................ 23 3.3 车牌字符分割 ................................................................................................................................ 24 3.4 车牌字符识别 ................................................................................................................................ 25

3.4.1 Tesseract OCR引擎 ........................................................................................................... 25 3.4.2 车牌语言的训练 ................................................................................................................ 25 3.4.3 Tesseract库在Android中的使用 ..................................................................................... 27

4 需求分析与设计 ........................................................................................................................................ 29 4.1

功能需求 ........................................................................................................................................ 29 4.1.1 用例模型 ............................................................................................................................ 29 4.1.2 交互图 ................................................................................................................................ 32 4.2 非功能需求 .................................................................................................................................... 34

5

系统设计、实现与测试 ............................................................................................................................ 36

8

武汉理工大学毕业设计(论文)

5.1

系统的设计 .................................................................................................................................... 36 5.1.1 程序逻辑设计 .................................................................................................................... 36 5.1.2 数据库设计 ........................................................................................................................ 38 5.2 系统实现 ........................................................................................................................................ 38

5.2.1 支撑条件 ............................................................................................................................ 39 5.2.2 类的实现 ............................................................................................................................ 41 5.2.3 数据库模式 ........................................................................................................................ 42 5.3 运行与测试 .................................................................................................................................... 43

5.3.1 运行演示 ............................................................................................................................ 43 5.3.2 测试 .................................................................................................................................... 46 6

结语与后续计划 ........................................................................................................................................ 48

参考文献 ............................................................................................................................................................ 49 致 谢 ................................................................................................................................................................ 52

插图目录:

图1 Android架构图 ................................................................................................................................ 15

图2 OpenCV的构成 .................................................................................................................................. 20 图3 AndroidVIQ项目目录结构 .............................................................................................................. 21 图4 原始车辆图像 ................................................................................................................................. 22 图5 灰阶图像 ......................................................................................................................................... 22 图6 平滑与增强过后的灰阶图像 ........................................................................................................... 22 图7 二值图像 ........................................................................................................................................... 23 图8 轮廓图像(黑色背景上的白色轮廓线,不易观察) ................................................................... 23 图9 检测出的车牌图像 ........................................................................................................................... 24 图10 车牌图像的轮廓 ............................................................................................................................. 24 图11 分割后的车牌字符 ......................................................................................................................... 25 图12 分割后再合并的车牌字符 ............................................................................................................. 25 图13 车牌字符训练图片 图14 连通多部首汉字以简化盒子文件的修改 .................................. 26 图15 项目tesseract-android-tools的目录结构 ............................................................................. 27 图16 本系统直接用例模型 ..................................................................................................................... 30 图17 系统抽象用例模型 ......................................................................................................................... 30 图18 细化并扩展了的用例模型 ............................................................................................................. 31 图19用例“编辑车辆信息”的顺序图 .................................................................................................. 33 图20 UI类的交互图 ................................................................................................................................ 34 图21 用例“浏览车辆信息库”和“浏览车辆登记单”实际的类图 ................................................. 37 图22 项目目录结构 ................................................................................................................................. 39 图23类“VehicleItemViewActivity”的实现 .................................................................................... 42 图24 车辆信息库 图25 快速查找 图26 快速查找 ............................................................. 43 图27 车辆信息库列表项的上下文菜单 图28 查看车辆 图29 编辑车辆信息........................ 44 图30 删除车辆信息 图31 联系车主 图32 浏览车辆登记单 ................................................. 44 图33 查看车辆 图34登记车辆 图35 登记信息立即显示在了登记记录列表中..................... 45 图36 查询/登记车辆 图37 成功登记的车辆 图38 创建车辆信息 ....................................... 46 图39 成功创建车辆信息 ......................................................................................................................... 46

9

武汉理工大学毕业设计(论文)

摘 要

本文基于Android移动操作系统,集成了OpenCV、Tesseract OCR、JavaCPP、SQLite等几大开源技术,设计并实现了一个基于Android平台的车辆信息查询系统。该系统除针对车辆信息及其车辆登记记录简单快捷的增删改查操作外,还具有自动车牌识别、快速拨打电话、多终端数据同步等功能,能满足小区(停车场)车辆管理、“黑的”鉴别、基于车辆识别的个性化服务等诸多场景的需求。

论文主要学习、研究基于Android平台的车辆信息查询系统的技术实现,具体内容包括:Android技术背景,Android平台本地应用的开发,Android平台数据的存储与同步,以及Android平台上车牌识别技术的实现。

通过本对课题的调查、研究与实现,归纳出了Android系统在车辆管理方面的典型应用场景和用例;介绍了与之相关的理论和技术基础;详细讲解了这些理论和技术基础在本系统中的实践与运用;围绕数据同步子课程,研究了在多个Android终端间同步数据的解决方案;围绕关键子课题车牌识别,研究并采用了OpenCV作为车牌图像处理技术,Tesseract OCR作为车牌字符识别技术,JavaCPP作为在Android平台上高效调用OpenCV与Tesseract OCR共享库的技术,以及Android上内置的SQLite嵌入式数据库技术。

本文的特色在于:1)将车牌识别技术在Android上成功实现;2)集成创新,车牌识别等技术取材于谷歌代码上的开源项目,源码易于获得且允许商业应用;3)本课题亦以开源项目的形式开展。

关键词:Android; 车牌识别; 信息系统; OpenCV; Tesseract OCR; JavaCPP; SQLite

10

武汉理工大学毕业设计(论文)

Abstract

This thesis implements a Vehicle Information Query (VIQ for short) system based on Android mobile operating system. It integrates four open source technologies: OpenCV, Tesseract OCR, JavaCPP and SQLite. Besides a set of fast CRUD operations on vehicle information and vehicle checking records, the implemented VIQ system also has features like automatic licence plate recognition (ALPR), fast call making, data sync among multiple terminals and more, which can satisfy requirements of senerios like community (or parking lot) vehicles management, illegal taxis identification, customized services based on vehicle identification and so on.

In this thesis, we studied the implementation of VIQ systems based on Android. It mainly includes: 1) the background of Android; 2) the development of Android local application; 3) the storage and sync of data on Android; and 4) the implementation of ALPR on Android.

Through the investigation, study and implementation of this degree project, this thesis has summarized some typical scenarios and use cases of Android applications on vehicle managements; introduced related theory and technology basis; detailed the application of them in this project; on data sync, studied solutions to syncing data among multiple Android terminals; on ALPR, studied and adopted OpenCV as the way to manipulate images, Tesseract OCR as the way to recognize licence plates, JavaCPP as the way to efficiently call the underlying shared libraries of OpenCV and Tesseract OCR, and SQLite as the way to save permanent data on Android.

Features of this thesis: 1) Having ALPR implemented on Android. 2) An integrated innovation, with technologies like ALPR from open source projects at Google code; source codes are easy to get and available for commercial use; 3) The background degree prjoect also developed as an open source project.

Key Words:Android; licence plate recognition; ALPR; information system; OpenCV; Tesseract OCR; JavaCPP; SQLite

11

武汉理工大学毕业设计(论文)

1 绪论

随着国民经济的发展,车辆迅速普及。小区、停车场、道路等车辆集中的地方,存在需对问题(占用车位、违规停放等)车辆或来往车辆进行登记和身份鉴定等诸多需求,以实现诸如快速联系车主、计时计费、“黑的”鉴别、基于通过车辆识别取得顾客定制信息的个性化服务等业务应用。这些应用普遍存在场地不固定、需求变化快等特点,传统基于固定车牌识别装置和台式计算机的车辆管理系统很难适应。即使努力适应,建设传统车辆管理系统,需要有专用的摄像装置;车辆的行驶路径和停放位置须服从摄像装置的要求;需要设置护栏,却又容易导致车辆停放困难。这此无疑增加了车辆信息管理的成本,制约了车辆信息数字化的进程。

移动智能终端的普及,让移动计算正取代传统桌面计算成为越来越重要的信息处理方式。Android移动操作系统在移动计算平台中处于领先的地位。配备摄像头、GPS和网络功能的Android终端尤其是Android手机,完全能在车辆管理信息系统中扮演重要的角色,其中最重要的是车辆信息的查询,其次重要的是车辆信息的登记。Android终端在扮演这一角色的过程中,有两大问题需要解决:一、有限的计算能力,如何快速准确地进行车牌识别,以自动查询车辆信息,并对车辆信息进行结构化记录;二、多终端协同工作,在网络不可靠的情况下,如何获取与存储数据,又如何在一定程度上保持数据的同步,以共享最新的车辆信息,或供进行统计与决策。

关于Android平台上的车牌识别,在本系统中,我们通过使用JavaCPP和JNI技术实现了对OpenCV和 Tesseract OCR本地代码库的调用;为了准确识别出车牌号码,我们通过Tesseract训练出了中华人民共和国机动车号牌[1]的语言包。关于Android平台上数据的存储与同步,在本系统中,我们采用了Android内建的SQLite技术进行数据的结构化存储与访问;特别针对Android 4.0及以上版本,讨论了端对端Wi-Fi直连通讯技术的实现。

1.1 问题描述与项目动因

车辆信息,包括车辆本身的信息——车牌号、车架号、车型、车名、车身颜色等和车主的信息——姓名、电话、身份证号、出生年月、驾照号等;为了更加易于识别车辆与车主,应该提供二者的照片;此外,车辆的活动登记,包括时间、地点、备注等,也是十分重要的信息。这些信息在实际典型场景中的应用,举例如下:

1)小区(停车场)车辆管理

目前,很多小区都为户主分配了专用的停车车位,车位未经允许被占用的现象却时有发生,在一定程度上扰乱了社区的和谐。对此,前来解决问题的小区保安可使用本系统,对问题车辆进行拍照。系统自动识别出该车车牌号,查询小区车辆备案数据库。如果查得该车属

12

武汉理工大学毕业设计(论文)

于小区户主,则可立即拨打户主电话;否则可将该车加入黑名单,备后续处理。对违规停放的车辆也可作相同的处理。

此外,部分小区、校园以及停车场,出入口众多或不固定,又不适合设置门禁,传统固定式车牌识别系统难以有效实施出入登记或计费。使用本系统,工作人员对入场车辆进行拍照登记,并开始计费;车辆出场时再次进行拍照,或取出其上次登记记录,结束计费。如有需要,还可以进行身份认证和信用查询。

2)“黑的”鉴别

武汉现有的违法运营计程车(俗称“黑的”),目前有超过4000辆[2]。黑的收费随心所欲,扰乱正常市场秩序,且没有安全和信誉保障,给市民出行带来了诸多问题。使用本系统,巡逻警察跟踪可疑计程车并拍照登记,同时记录时间和位置。根据所识别车牌号查询备案计程车数据库。如果找不到拥有该车牌号的合法计程车信息,则可进一步追查;如果找到,通过照片对比和询问车主现在的位置,即可判断该车是否真实。

3)服务机构个性化服务

个性化、定制服务能给顾客带来宾至如归的感觉,也是很多服务机构的重要业务内容。使用本系统,服务机构保安拍摄或输入前来的顾客车辆的车牌号,从该机构建立的顾客信息数据库中取出顾客的相关信息。顾客下车前,其称呼、喜好、来访记录已为迎宾人员所掌握;定制的或与上次相同的服务可立即提供。

上述应用场景要求移动智能设备有拍照、自动车牌识别、自动记录时间和地点、快速查询车辆信息、保存车辆信息等功能。此外,数据备份、多设备间数据同步、与计算机共享数据等,也是隐含的功能需求。

本项目即致力于设计并实现一个基于Android平台的车辆信息查询系统,以满足上述应用场景的需求。

1.2 篇章结构

本论文正文部分围绕以下结构展开:

第二章介绍Android移动操作系统,重点介绍了Android平台本地应用的开发和数据的存储与同步技术。

第三章介绍车牌识别的理论、技术以及在Android平台上的实现。它是本项目的创新点和核心工作之一。

第四章介绍系统需求的分析与设计。 第五章介绍系统的设计、实现与测试。

第六章总结全文,并对接下来的工作提出展望与规划。

13

武汉理工大学毕业设计(论文)

2 Android移动操作系统

2.1

移动计算

移动计算是随着移动通信、互联网、数据库、分布式计算等技术的发展而兴起的新技术。移动计算技术将使计算机或其它信息智能终端设备在无线环境下实现数据传输及资源共享。它的作用是将有用、准确、及时的信息提供给任何时间、任何地点的任何人。这将极大地改变人们的生活方式和工作方式[3]。

手持移动设备,或手机,特别是智能手机,将是由传统桌面计算向移动计算或云计算这一转变过程中的主力军。随时随地可用,传感器丰富等相对传统桌面计算机的突出优点,为智能手机改变人们的工作与生活提供了各种可能。智能手机将逐步发展成人们眼、耳、脑以及不存在感官的延伸,帮助人们获取、处理、存储与呈现信息,帮助人们作出决定,展现给人们美好的事物,引领人们更加智慧与舒适地生活。

移动平台是目前和将来相当一段时间应用部署的重要平台。2012年年初,苹果应用商店已经拥有了超过53万款应用,而Google Play所能提供的应用数目也已突破了40万大关,涵盖了游戏、效率、社交、购物、交通、体育、图书与工具书等等领域,渗入了生活的方方面面。下载量上,仅以Android以例。最高下载量已达5亿(谷歌地图),相当多的免费应用的下载量在十万级别以上,收费应用也在万级别以上(具体请参照Google Play)。一款受欢迎的应用的市场价值十分巨大,而且这一市场才刚刚起步。

2.2 Android技术背景

Android是用于移动设备上的一个包含一操作系统,一系列中间件,以及部分关键应用软件栈。Android SDK网站提供了在Android平台上使用Java编程语言开发应用程序所必须的工具和API[4]。

2.2.1 Android的特性

 应用框架,实现了组合的重用与替换  Dalvik虚拟机,专为移动设备优化  集成的浏览器,基于开源的WebKit引擎

 优化的图形,由一个定制的2D图形库驱动,3D图形基于OpenGL ES 1.0规范(硬

件加速可选)

 媒体支持,支持常用音频、视频以及图像格式(MPEG4, H.264, MP3, AAC, AMR,

JPG, PNG, GIF)  GSM通话(依赖硬件)

14

武汉理工大学毕业设计(论文)

 蓝牙,EDGE(增强型数据速率GSM演进技术),3G,以及Wi-Fi(依赖硬件)  相机,GPS,指南针,加速计(依赖硬件)

 丰富的开发环境,包括一个设备模拟器,测试工具,内存和性能分析,以及用于

Eclipse IDE的一个插件

2.2.2 Android架构

图1 Android架构图

Android架构由上至下分四层,如图1。描述如下:

 应用层:包括由系统默认提供了桌面、联系人、通话、浏览器等基础应用,以及

由广大开发人员开发、可下载安装的拓展应用。拓展应用访问下层应用框架层方面,和由厂商提供的基础应用一样,没有任何尊卑之别。

 应用框架层:应用开发基本的API,提供包管理、通话管理、资源管理、位置管

理、通知管理、Activity管理,窗口管理、内容提供设施、视力系统。  库:用C/C++写成。提供SGL底层2D绘图引擎,安全套接层,嵌入式标准C

库,OpenGL 3D绘图,FreeType字体,浏览器核心,用户空间显示管理,媒体框架,以及轻量级SQLite关系型数据库。

 运行环境:与JRE极其相似。核心包包含了在Java开发中常用的类库如IO、Utility

等;Dalvik虚拟机类似JVM,同样也是专为Android定制,针对手持设备,在存储、计算以及功耗等方面作了格外优化。

 Linux 内核:Android整个操作系统基于Linux内核,内核提供显示、照相、闪

15

武汉理工大学毕业设计(论文)

存、软键盘、Wi-Fi、音频等驱动程序,提供对进程间通信机制Binder的驱动,提供电源管理服务。

2.3 Android平台本地应用的开发

同PC上应用的部署模式一样,Android应用也可有纯本地应用,C/S模式和B/S模式。此外,C/S和B/S相结合的模式——本地应用利用Web控件显示Web页面,或Web应用利用Javascript调用本地程序——也十分常见。此外,具有数据同步功能的本地应用模式,在联系人、日历、电子邮件等核心应用中都有体现。

2.3.1 虚拟机之上的Java应用

Android应用(至少是目前)是使用Java语言开发的。Java代码被编译成字节码,再被编译成.dex可执行文件,以在Dalvik虚拟机上高效运行。Android应用由四大组件构成——Activity, Service, Content Provider, 和Broadcast receiver。每个组件以类的形式存在。类应该具有高度的内聚性;类与类之间应该具有极低的耦合性。Activity负责呈现用户界面并与用户交互;Service运行在后台,负责处理耗时操作,或是为服务远程进程;Content Provider负责管理可被共享的应用程序数据;Broadcast receiver则能响应系统级的广播消息。Android系统设置独有的特点是,任何应用都能启用其他应用的组件,显式或隐式地。一个Activity可以调用另一个Activity或Service;Service可在Activity结束之后关闭,或继续运行。当系统启用某一应用的某一组件,该应用的进程就被启动(如果不是已经启动了的话),该组件所需的类就被初始化。不同于其他的系统,Android应用程序没有唯一的入口(比如就没有main()函数)[6]。

2.3.2 Linux之上的C/C++本地代码

Android应用由Java所写,运行在虚拟机上,在处理大量数值、矩阵运算时,效率比较低。C、C++则直接运行于硬件之上,能充分发挥硬件的性能。此外,大量传统与广泛使用的底层库文件(包括图形图像处理、数据库管理系统等)都是由C/C++写成,它们向Android平台的迁移应以怎样的方式进行呢?下面介绍三种方式:JNI,JNA和JavaCPP。

1)JNI(Java Native Interface)

JNI,Java本地接口,是一个允许运行在Java虚拟机上的Java代码调用本地代码或被本地代码调用的应用编程框架。本地代码即指用C/C++或汇编写成的、依赖硬件和操作系统平台的程序或库。它定义了可管理代码(用Java语言写成)与本地代码交互的方法。它厂商中立,支持从动态链接库载入代码;虽然繁琐,但常能获得可观的效率[7]。

2)JNA(Java Native Access)

JNA,Java本地访问,是SUN公司主导研发的,建立在经典的JNI的基础之上的一个开源框架。它是也另一个访问本地代码的方法,大有取代JNI的趋势。JNA的设计就是为了提供一种自然的方式、以最少的工作量实现对本地代码的访问。它不需要像JNI

16

武汉理工大学毕业设计(论文)

中那样的样板文件或生成的粘合代码[9]。JNA堪比Window的P/Invoke和Python的ctype。

但是,Android官方并没有集成JNA。据Android开源项目参与者fadden回答:第一是因为性能不如JNI,在对性能要求高的应用中人们更倾向于使用JNI;第二是因为使用Java和公开的API来实现应用更有利用应用程序自身和Android的发展;第三是JNA遵循的是LGPL许可,将它放入Android官方发行会带来许可问题。尽管如此,Android官方仍然会考虑在虚拟机中提供挂钩,允许开发者将JNA库作为应用程序安装包的一部分,自行使用[10]。JNA源代码可从GitHub获得[11]。

3)JavaCPP

JavaCPP提供了在Java中高效访问C++的方法,与某些C/C++编译器与汇编语言交互的方式颇为类似。在其底层,同样采用的是JNI,因此所有的Java实现它都支持,包括Android。与其他访问本地代码的途径(包括SWIG,CableSwig,JNIGeneratorApp,JNIWrapper,Platform Invoke,GlueGen,JNIDirect,JNA,JniMarshall,JNative,J/Invoke,HawtJNI,BridJ等等)所明显不同的是,它高效而自然地支持C++语言许多经常被认为有弊病的特性,包括操作符重载、模板类和模板函数、成员函数指针、回调函数、嵌套结构体定义、可变长参数、嵌套命名空间、包含任意循环的大数据结构、多继承、按值/引用/微量传递、匿名结构体、位域、异常、析构以及垃圾回收。JavaCPP项目的作者samuel已经通过JavaCPP,为OpenCV,FFmpeg,libdc1394,PGR FlyCapture,OpenKinect,videoInput,和ARToolKitPlus等图像库生成了完整的接口,集成到了他的开源项目JavaCV当中[18]。JavaCPP底层实现最开始使用的是JNA,后来又回到了JNI[10]。

2.4 Android平台数据的存储与同步

2.4.1 嵌入式关系数据库管理系统SQLite

SQLite是一个包含一个自包含、无服务、零配制、事务型的SQL数据库引擎的软件库。它是世界上最流行的数据库引擎之一。并且,SQLite的源代码已经进入了公共域,可自由使用[11]。Android提供了对SQLite数据库的完全支持。你所创建的任何数据库都能被当前应用中的任何类按名访问,当前应用之外的类则不行[12]。 2.4.1.1

SQLite 3中的数据类型[14]

大部分数据库引擎(就我们所知,除SQLite之外的任何其他数据库引擎)使用着传统的静态类型。静态类型下,一个值的数据类型由其容器——该值所存储在的列——所决定。

SQLite使用一种更加泛化的动态类型系统。在SQLite中,一个值的数据类型依赖于其值本身而非其容器。在其他静态类型数据库上能使用的SQL语言,在SQLite上同样能使用;在这一意义上讲,SQLite的这一动态类型系统相对其他数据库的静态类型系统具有向后兼容的能力。而且,SQLite中的动态类型能让它完成传统类型数据库所不能完成的工作。

17

武汉理工大学毕业设计(论文)

最后,值得注意的是,SQLite对特殊的一列ROWID的处理。它与在Android中对SQLite的访问密切相关。 2.4.1.2

ROWID和整型主码

SQLite表的每一行都有一个64位有符号整数键,唯一地标识表中该一行。该整数通常被称作“rowid”。rowid的值可使用以下任意列名的任意大小写形式访问:“rowid”“oid”或“_rowid_”。如果一个表已经存在了一个用户定义的名叫“rowid”“oid”或“_rowid_”的列,则使用这些名字时,访问的是用户定义的列;这一整型rowid行将不再能被检索到[15]。

SQLite的每一张表都以一棵B树的数据结构存储。该树包含了对每一行的一个入口,入口地址是一个整型主码(INTEGER PRIMARY KEY),或rowid。这意味着按rowid检索或排序记录速度极快。搜索某一指定或在某一范围内的rowid的行,比相同情况下在其他主码或索引上搜索,要快一倍[15]。

也正是这个原因,Android中重要的UI组件ListView访问SQLite数据库所使用的适配器CursorAdapter对查询结果Cursor的列有一个特殊的要求:必须要有一个名叫“_id”的列[16]。在实现上,ListView的一行(即一个ListItem)对应Cursor的一行;据观察,Android为该ListItem分配了id,其值正是“_id”列的值。可通过以下方法获得ListView中的某一项的id:

方法一:单击列表项的回调函void android.app.ListActivity.onListItemClick(ListView l, View v, int position, long id)的形参中本身就有id;

方法二:长按列表项,引起上下文菜单弹出的回调函数boolean android.app.Activity.onContextItemSelected(MenuItem item)中,可以这样取得被长按列表项的id:

//获取弹出菜单的菜单信息;该菜单信息包含了适配器上下文信息,其中就包含了适配器为当前列表项绑定的(Cursor的)id AdapterContextMenuInfo info=(AdapterContextMenuInfo) item.getMenuInfo(); //当前列表项的id int id=info.id; 此外,要获取当前列表项中子View的值,也有快捷的方法:

//当前列表项在适配器上的位置 int position=info.position; //获取适配器为当前列表项绑定的Cursor(或一行记录) Cursor cursor = (Cursor) getListAdapter().getItem(position); //反过来获取Cursor中的列“_id”的值,与info.id对比 String _id = cursor.getString(cursor.getColumnIndex(\"_id\")); Log.v(TAG, \"_id at position \" + position + \对比会发现,无论对列表项进行新增、删除、排序等任何操作,id与_id均相同;相反,position表示的只是当前列表项在列表ListView中的下标,与id或_id没有直接的关系。

18

武汉理工大学毕业设计(论文)

以上问题是困扰作者本人在内的许多开发者许久的问题。通过一定的分析和实验,结果是可知的。这或许也是做开发的乐趣之所在。

2.4.2 Android平台的数据同步

Android终端同Web服务器、Android终端与终端之间的数据同步,可以采用同Android系统中谷歌帐户应用(Gmail、Google Calendar等)类似的方法,通过SampleSyncAdapter,利用Android框架中的帐户管理器和同步管理器实现。这里不再赘述。本文将讨论的,是基于Android 4.0及以上版本API中引入的最新技术——端对端Wi-Fi直连通讯技术。 2.4.2.1

端对端Wi-Fi直连通讯技术

从Android 4.0(API 14)开始,Wi-Fi直连通讯技术允许设备通过Wi-Fi直接(Wi-Fi Direct)连接,不再需要中间互连点(如无线路由器或Wi-Fi热点)。使用Android所提供的API,你可以发现并连接到同样支持Wi-Fi直接的设备上,然后与之进行比蓝牙距离更远的高速通信。

基于该技术,我们构想出了两种多终端通信方式:1)C/S单向同步。2)对等双向同步。鉴于实验条件不允许,我们仅对逻辑的实现作理论的分析。相信经过这一分析,在Android API 14实现起来是不难的。

(1)C/S单向同步

在该同步方式中,指定一台设备作为服务器,或才最先启动同步服务的设备自动作为服务器;其他设备作为客户机;首先轮流上传各自的数据,服务器负责数据的新增、更新与合并;然后轮流从服务器下载最新的数据。

作为服务器的设备(服务设备)首先启动同步服务,其他设备(请求设备)搜寻到该设备,发送同步请求。服务设备在用户的协助的对请求设备进行身份认证,并允许保存身份信息(即配对)以供下次免认证连接。服务设备上启用一个服务,或为每个设备启用一个服务,响应所有设备发送过来的通知(包含对数据变更的描述和数据本身)。响应操作包括:备份同步前的数据;新增设备新增的记录,缓存设备的修改和删除请求并在最后提示用户确认(修改或删除),最后标记版本。全部设备的变更上传完成后,服务设备转而向所有请求设备发送指令,备份并删除其同步前数据,并下载同步后的数据。

(2)对等双向同步

在该同步方式中,设备间对等通信,向其他配对设备播送自身数据的变化,同时接收与处理其他配对设备数据变化的通知。该方式与C/S单向同步的不同之处在于,设备同时扮演两种角色:服务设备和请求设备;无需下载同步后数据。

两种同步方式都希望所有设备在当时当地可用,否则每一部设备上的数据都不是严格意义上“最新”的数据。但在实际应用中,对“最新”的要求并不高;相反,每周一次的同步(比如在例会与工作总结时同步工作数据),在同步时展示与统计每一部终端的数据变更,反而有得于对工作的评价。

19

武汉理工大学毕业设计(论文)

3 Android平台上的车牌识别

车牌识别这里特指自动车牌识别,即运用计算机视觉技术,从包含车牌的图像中自动探测到车牌区域,提取该区域车牌图像进行进一步处理,使其中的车牌字符适合光学字符识别(OCR)引擎识别,最后返回完整的车牌号字符串的过程。该过程包含的三大核心环节对识别率起到了至关重要的作用:1)车牌探测;2)车牌字符分割;3)车牌字符识别。下面对其分别进行描述并加以实现。

3.1 图像处理

在图像学中,图像处理是对输入图像的任何形式的信号处理;其输出可以是一幅图像,或与之相关的字符集或参数[19]。本课题中包含大量的图像处理,因此我们研究并采用了开源图像处理库OpenCV。

3.1.1 OpenCV

OpenCV(开源计算机视觉)是一个用于实时计算机视觉的程序函数库。它在BSD许可下发布,学术和商业上均可免费使用。它拥有能运行在Windows、Linux、Android以及Mac上的C++、C、Pythoon和Java的接口。该库拥有超过2500个算法的优化。使用者遍布全球,拥有2,500,000以上的下载量和40,000用户组成员。使用范围从交互艺术到矿物探测,再到Web图形检索等领域[20]。

OpenCV由英特尔公司于1999年起开发,用C/C++写成,包含了500多个函数。OpenCV的构成如图2。

CV 图像处理和视觉算法 HighGUI GUI,图像和视频 I/O CXCORE 基本结构和算法,XML支持,绘图函数

图2 OpenCV的构成

3.1.2 JavaCV

JavaCV是一个OpenCV的Java接口。它为计算机视觉领域调查者们常用的库提供了封装。这些库包括:OpenCV,FFmpeg,libdc1394,PGR FlyCapture,OpenKinect,videoInput,和ARToolKitPlus等。com.googlecode.javacv.cpp包命名空间下的类便展示出了完整的API。

20

武汉理工大学毕业设计(论文)

并且,实用类还使自身的功能在Java平台包括Android平台上更加可用[21]。

JavaCV开源项目的负责人samuel,即前述JavaCPP项目的负责人。JavaCV正是利用JavaCPP技术实现的OpenCV的Java接口。编译或生成javacpp.jar和javacv.jar,作为本项目的引用包;将javacv-android-arm.jar和OpenCV-2.4.0-android-arm.zip中所有的库文件解压至项目根目录下的libs/armeabi文件夹中,即完成了对JavaCV库引用。项目目录结构如图3。具体请参照项目主页的介绍。

图3 AndroidVIQ项目目录结构

3.2 车牌探测

在图像处理技术中,Haar特征提取技术常用于从图像中提取物体[22]。该技术涉及神经网络等算法,限于知识水平,暂不研究。边缘检测作为一种简单的物体检测方法,特别适合于矩形外框的车牌。本课题采用基于边缘检测的车牌探测技术。原始车辆图像如图4。

21

武汉理工大学毕业设计(论文)

图4 原始车辆图像

3.2.1 将原始图像转化为灰阶图像

cvCvtColor(mVehicleImage, vehicleImageGray, CV_BGR2GRAY);

图5 灰阶图像

3.2.2 灰阶图像的平滑与增强处理

cvSmooth(vehicleImageGray, vehicleImageGray, CV_GAUSSIAN, 3); cvEqualizeHist(vehicleImageGray, vehicleImageGray);

图6 平滑与增强过后的灰阶图像

3.2.3 灰阶图像转化为二值图像

cvThreshold(vehicleImageGray, vehicleImageBinary, 128, 255, CV_THRESH_BINARY);

22

武汉理工大学毕业设计(论文)

图7 二值图像

3.2.4 从二值图像中提取轮廓

CvSeq contours = new CvSeq();

int objects = cvFindContours(vehicleImageBinary, cvCreateMemStorage(0), Loader.sizeof(CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

contours,

图8 轮廓图像(黑色背景上的白色轮廓线,不易观察)

3.2.5 基于边缘检测的车牌探测

经检测,提取的图像轮廓中有约1800个独立轮廓区域。我们这样来找到车牌轮廓区域:用指定精度逼近曲线轮廓,形成一个多边形轮廓;如果多边形为四边形,面积足够大,且宽高比介于2.8到3.4之间(普通车牌外廓尺寸为440mm×140mm,宽高比为3.14),则可初步判断它为车牌轮廓,接下来的工作将围绕该区域展开。示例代码如下:

//获得多边形轮廓 CvSeq polyContours = cvApproxPoly(contours, Loader.sizeof(CvContour.class), cvCreateMemStorage(0), CV_POLY_APPROX_DP, cvContourPerimeter(contours) * 0.05, 0); //检查轮廓边数和面积

23

武汉理工大学毕业设计(论文)

if (polyContours.total() == 4 && cvContourArea(polyContours, CV_WHOLE_SEQ, 0) > 600) { //获得轮廓外框 CvRect boundingRect = cvBoundingRect(polyContours, 0); //检查轮廓宽高比 double plate_HWratio = ((double) boundingRect.width()) / ((double) boundingRect.height()); if (plate_HWratio > 2.8 && plate_HWratio < 3.4) { //设置原来备份的车辆灰度图像的ROI(感兴趣区域) cvSetImageROI(vehicleImageGrayClone, boundingRect); //接下来:进行车牌字符的分割 //TODO: character segmentation on the licence image } } 检测出的车牌图像如图9。于是,接下来将进行车牌字符的分割。(车牌的偏斜矫正一般情况下没有必要,本文不讨论。)

图9 检测出的车牌图像

3.3 车牌字符分割

对于原来备份的车辆灰度图像,在设置好ROI——车牌区域之后,进行Canny边缘检测,获得车牌图像的轮廓,如图10。

图10 车牌图像的轮廓

//对车牌图像进行边缘检测

cvCanny(licenceImage, plateImageCanny, 128, 255, 3);

同样通过cvFindContours()函数找到连续的轮廓,逐一判断是否为车牌字符。判断方法为:轮廓的外框,高度大于车牌高度的二分之一,且宽度小于车牌宽度的四分之一者,即为车牌字符。以此,车牌中的点号、孔隙和小范围的污点均已被自动去除。所得的单个的字符如图11。

24

武汉理工大学毕业设计(论文)

图11 分割后的车牌字符

分割后的字符,可以单独识别,也可以拼接后一起识别,如图12。为了提高识别率,还可以增加字符与背景的对比度,并应准偱OCR引擎对前景背景色的要求。

图12 分割后再合并的车牌字符

3.4

3.4.1

车牌字符识别

Tesseract OCR引擎

Tesseract OCR引擎是1995年UNLV Accuracy大赛中的排名前三的引擎。1995年到2006年间,它没有大的改进;之后,它被谷歌大幅改进,很可能是识别率最高的可用开源OCR引擎之一了。结合Leptonica图像处理库,它能读取各种各样格式的图像文件,识别出超过40多种语言的文本[23]。

目前该引擎已经对中文识别有了一定的支持。然而对于大陆车牌文字,它的识别率并不高。原因在于,国家车牌字符使用的是一种特殊的字符,以便于区分。它不同于标准印刷符。因此须为Tesseract OCR引擎训练出专供车牌识别的语言包。 3.4.2

车牌语言的训练

车牌语言训练的过程,就是提供给计算机目标文字图像及相应的文字,让计算机自动分析并存储这一对应关系的过程。Tesseract为训练过程提供了一定的支持。

首先,取得带标准车牌文字的图像文件。GA 36-2007 中华人民共和国机动车号牌B.1 外廓尺寸为440mm×140mm的号牌[1],是最佳的材料。

然后,将它们上下拼接成一幅图像,保存成TIFF格式。图像宽高建议为1056*2000(单位像素),图像分辨率96dpi,命名为“cnlp.cnlf.exp10.tif”。之所以将三类图像拼接成一幅图像,一方面是应官方文档要求,一类字体一幅图片,三类字符同属一种字符(这里命名为“cnlf”);另一方面是为了简化训练过程。如图13(由于警车车牌不在本课题讨论范围之内,为简化操作,未将其包含进来)。

25

武汉理工大学毕业设计(论文)

图13 车牌字符训练图片 图14 连通多部首汉字以简化盒子文件的修改

接下来开始生成中间文件。首先在计算机上安装Tesseract引擎(目前是tesseract-ocr-setup-3.01-1.exe )。然后,在命令行执行以下命令:

tesseract cnlp.lpft.exp10.tif cnlp.lpft.exp10 batch.nochop makebox 该命令将使用默认的语言(英文)对cnl.cnlf.exp10.tif进行识别。识别结果将生成盒子文件文件cnlp.lpft.exp10.box,文件中每一行均为所识别出的字符、其在训练图片中的坐标(四列分别是左、下、右、下,坐标原点为图片左下角)以及页号(单页训练图片页号恒为0)。

对使用默认语言自动生成的盒子文件进行一定的修改,再输入计算机,即完成了新语言学习中的重要一步。如果自动生成的盒子文件中的字符能与正确字符良好对应(如本训练图片中的数字1在盒子文件中被识别成了“|”),修改例子文件将非常快捷,改正字符即可;如果一个字符被tesseract解释成了多个字符(如“苏”被解析成了“艹”和“办”),在盒子文件中得到了多行记录,则需要采取一定的手段找到所识别行与目标字符的对应关系,并合并错误的行。具体参考官方文档训练Tesseract3[24]。

其实,针对上述问题,有一个简单的办法。问题的原因在于汉字字符多偏旁部首,容易被tesseract当作多个字符对待;生成盒子文件的目的,只是用文本文件表示出目标字符及其在训练图片中的区域。因此,我们可以为不连通的字符添上笔画,使之完全连通。在识别出盒子后,再换回原图,用于接下来的特征记录。图14便能完好地生成72行字符数据。

接下来的工作要简单得多。按训练Tesseract3中的步骤:

//训练Tesseract: tesseract cnlp.lpft.exp10.tif cnlp.lpft.exp10 nobatch box.train //计算字符集:

26

武汉理工大学毕业设计(论文)

unicharset_extractor cnlp.lpft.exp10.box //读取字体属性:(新建字体属性文件font_properties,内容为“lpft 0 0 1 0 0”) mftraining -F font_properties -U unicharset cnlp.lpft.exp10.tr //分类归并: mftraining -F font_properties -U unicharset -O cnlp.unicharset cnlp.lpft.exp10.tr cntraining cnlp.lpft.exp10.tr //其他文件(数据字典、unicharambigs)均不必提供。 //汇集所有中间文件,生成语言包:(先须为normproto、Microfeat、inttemp、pffmtable 和unicharset等文件加上语言名前缀,这里用“cnl.”;语言名建议遵循ISO 639-2标准) combine_tessdata cnl. 不出意外,专用车牌语言包cnl.traineddata即生成成功!cnl.traineddata同样可在参考文献[25]中下载得到。

重要提醒:训练语言包的过程中,可能会有这样或那样的问题。多尝试,多分析,查阅Tessearct项目的问题列表,并勇于提问,最终一定能成功。关于上述过程的讨论,详见Tessearct项目第557号问题讨论[25]。 3.4.3

Tesseract库在Android中的使用

Tesseract库在Android中的使用,同样由JNI实现。开源项目tesseract-android-tools[26]是一个Android库项目[27],提供了用于使用Tesseract OCR和Leptonica图像处理库的一系列Android API和构建文件。该项目的目录结构如图15。

图15 项目tesseract-android-tools的目录结构

共享库liblept.so和libtess.so可以直接通过NDK编译生成;目录jin下存放的是这两

27

武汉理工大学毕业设计(论文)

个库的C/C++源文件和编译指令。有关NDK的相关知识,请参考Android官方文档[28]。

包com.googlecode.tesseract.android下的类TessBaseAPI即为Tesseract OCR引擎的Java接口。它并没有实现所有可用的JNI方法,不过实现的方法已经够用。它们主要包括:  com.googlecode.tesseract.android.TessBaseAPI.TessBaseAPI()

构造TessBaseAPI实例。

 boolean com.googlecode.tesseract.android.TessBaseAPI.init(String datapath, String

language)

使用指定语言初始化Tesseract引擎。

 void com.googlecode.tesseract.android.TessBaseAPI.setPageSegMode(int mode)

设置页面分割模式,决定OCR引擎在识别文字之前要作多少处理。  void com.googlecode.tesseract.android.TessBaseAPI.setImage(Pix image)

设置待识别图像。

 String com.googlecode.tesseract.android.TessBaseAPI.getUTF8Text()

返回UTF8格式的识别出的文本。

 int com.googlecode.tesseract.android.TessBaseAPI.meanConfidence()

返回对文本识别结果的确定度。

库项目tesseract-android-tools为本项目使用,有两种方式:1)本项目直接引用打开的库项目(具体见Android官方文档[27]);2)将库项目生成的jar文件和so文件包含至本项目中。两种做法本质是一样的。但在实践过程中发现,在包含JavaCV项目(使用方式2)的同时引用tesseract-android-tools项目(使用方式1),本项目将在运行时报错,找不到JavaCV中的so文件。问题可能出自同时使用JNI和JavaCV调用本地代码时的冲突。解决办法是两个项目均使用方式2引用。关于本问题折讨论,详见tesseract-android-tools项目第119号问题[29]。

28

武汉理工大学毕业设计(论文)

4 需求分析与设计

从本章开始,我们将回到绪论中所描述的问题,应用前面两章所提供的技术手段,分析、设计并实现一个基于Android平台的车辆信息查询系统。

需求分析是系统设计与实现的前提,也是软件开发生命周期中最重要的一步。在面向对象的需求分析方法中,UML模型图起到了十分关键的作用。本章通过用例图来提取与静态地描述需求,通过交互图来动态地描述需求,以供总体设计中类与实体的提取、类图和实体关系图的生成。

4.1 功能需求

我们将通过建立用例模型来逐步描述、抽象、细化功能需求。

4.1.1 用例模型

根据“问题描述与项目动因”一节所描述的几种典型场景,分析出本车辆查询系统的直接用例模型。直接用例模型表征最原始的角色与场景,没有作抽象与细化。用例图如图16。

29

武汉理工大学毕业设计(论文)

<>小区保安问题车辆识别与登记<>身份认证,出入登记小区、校园、停车场门卫<>黑的鉴别与登记巡逻警察<>来客车辆识别,个性化服务服务机构保安

图16 本系统直接用例模型

所有上述用例本质上,可以抽象为单一用例——保安(巡警)进行车辆识别、登记与信息查询。用例图如图17。

<>车辆识别、登记与信息查询保安、巡警

图17 系统抽象用例模型

细化并扩展以上用例,得到一个能指导程序开发中类的设计与实现的详细用例模型,用例图如图18。

30

武汉理工大学毕业设计(论文)

快速查找车辆信息<><><>浏览车辆信息库<><><><><><>编辑车辆信息删除车辆信息复制车辆信息<><>短信发送车辆信息<><><><>查看车辆<>查看车辆信息<><><>查看登记记录<>电话联系车主登记该车保安/巡警<><><><>短信发送登记记录<><><><><>浏览车辆登记单<><><><>复制登记记录删除登记记录编辑登记记录快速查找登记记录添加至车辆信息库<>查询/登记车辆<>自动识别车牌号手工输入车牌号<><>选择车辆照片拍摄车辆照片 图18 细化并扩展了的用例模型

31

武汉理工大学毕业设计(论文)

如图18中所示,系统有四个主要功能(或用例):浏览车辆信息库,浏览车辆登记单,查询/登记车辆,查看车辆。分别描述如下:

(1)浏览车辆信息库

以列表形式显示所有的车辆信息;列表项包括车辆的注册图片,车牌号、车型、车架号,车主的姓名、联系方式、性别、年龄、驾照号,以及备注等内容。可通过输入关键词快速找到所需车辆信息。

每一个列表项(对应一个车辆信息),有如下操作:编辑车辆信息,删除车辆信息,复制车辆信息(可单独复制信息中的某一项或全部,以供进一步处理),短信发送车辆信息,电话联系车主,登记该车(新建一个车辆登记记录)。

(2)浏览车辆登记单

以列表形式显示所有的车辆登记记录;列表项包括登记时拍摄的车辆图片,通过图片识别出来或手工输入的车牌号,通过车牌号在车辆信息库中查到的车主姓名和电话,登记的时间和地点,以及备注等内容。可通过输入关键词快速找到所需车辆登记记录。

每一个列表项(对应一个车辆登记记录),有如下操作:编辑登记记录,删除登记记录,复制登记记录(可单独复制记录中的某一项或全部,以供进一步处理),短信发送登记记录,电话联系车主,登记该车,以及添加至车辆信息库(如果车辆信息库中没有该车的信息)。

(3)查询/登记车辆

以指定方式(手工或图像识别,可在设置中指定)输入车牌号。当识别率低于某一阈值时,手工输入方式将同样用来更正图像识别方式所得的车牌号。

(4)查看车辆

查看车辆信息以及与该车特有的登记记录单。可对车辆信息和车辆登记记录实施编辑、删除、复制等等操作。

4.1.2 交互图

本系统存在大量与用户的交互,用交互图(顺序图或协作图)来描述每个用例中系统与用户之间的交互,从而进一步明确用例的上下文和系统的职责,特别合适。

以用例“编辑车辆信息”为例。该用例是用例“浏览车辆信息库”和“查看车辆信息”共有的扩展用例;用户可直接对车辆信息库的某一列表项选择进行编辑,也可以先查看该列表项,再选择进行编辑。我们以后一路径为例,顺序图如图19。

32

武汉理工大学毕业设计(论文)

车辆信息库顶层包::保安/巡警启动程序车辆查看页车辆信息编辑页获取车辆信息列表数据车辆信息列表数据数据库适配器显示车辆信息列表查看车辆查看获取车辆信息及其登记记录列表数据车辆信息及其登记记录列表数据显示车辆信息及其登记记录列表编辑车辆信息编辑获取车辆信息车辆信息显示车辆信息保存车辆信息查看车辆车辆信息保存结果获取车辆信息及其登记记录列表数据车辆信息及其登记记录列表数据显示车辆信息及其登记记录列表

图19用例“编辑车辆信息”的顺序图

用户或执行者已经确定,是保安或巡警。在用例“编辑车辆信息”中,需要修改车辆信息中的某一字段,比如车主电话。首先,用户启动系统,类“车辆信息库”启动,并向类“数据库适配器”请求获得车辆信息列表数据。数据获得后,将其显示在用户界面中,等待用户的操作。用户通过触摸某一列表项,向类“车辆信息库”发送“查看车辆”的消息;类“车辆信息库”将该消息连同该列表项所对应的车辆ID发送至类“车辆查看页”;类“车辆查看页”向类“数据库适配器”请求指定车辆的数据,获得后将其显示在用户界面并等待用户的操作。继而,用户通过选择“编辑”菜单,向类“车辆查看页”发送“编辑”消息;类“车辆查看页”将该消息连同车辆ID发送给类”车辆信息编辑页”。类”车辆信息编辑页”同样地向类“数据库适配器”请求指定的车辆数据,获得后将其显示在用户界面上并接受用户的编辑。最后,用户退出或选择“保存”菜单时,类”车辆信息编辑页”将用户界面中的最新车辆信息发送给类“数据库适配器”,请求更新数据,然后将车辆ID发送给类“车辆查看页”,最终呈现在用户面前的是用户最可能希望看到的内容——编辑过后的最新车辆信息。

仔细分析,可以发现,交互图中的消息,与用户界面中的菜单(在Android中有上下文菜单和选项菜单两种)或可点击视图(如列表项、按钮)等UI控件有良好的对应关系;用户在一个类的上下文中(或在一个用户界面下),对UI控件的操作,即向该类的实例(对象)发送消息;监听用户动作的该对象获得这一消息,通过自身的动作(如改变用户界面的颜色)、

33

武汉理工大学毕业设计(论文)

调用其他对象并获取返回值(如向数据库访问对象请求最新数据并显示在用户界面)或转到其他类(不再返回)等形式执行用户的命令。这正是信息系统的运行方式。

上述顺序图仅仅展示了一个用例中类与类之间的交互。由上面的分析知,交互中的消息,实际上是用户界面中菜单、按钮等的抽象。我们将以一幅相对完整的交互图,来直观地展示各个UI类(或功能模块,在Android中为Activity的子类)之间的关系。UI类的交互图如图20。

Android系统车辆查询程序快速查找快速查找查看车辆车辆信息库删除车辆信息查看车辆车辆登记单删除车辆登记记录编辑车辆信息车辆查看页编辑车辆登记记录查询/登记车辆查询/登记车辆编辑车辆信息车辆信息编辑页联系车主短信发送车辆信息查询/登记车辆编辑车辆信息车辆登记记录编辑页短信发送车辆登记记录车辆查询/登记页短信发送车辆信息短信发送车辆登记记录<>信息联系车主联系车主<>通话

图20 UI类的交互图

如图20中所示,我们将类“车辆信息库”定为本车辆查询程序的主入口,由其显示所有车辆信息的列表;通过它,可以快速转到其他功能模块。箭头上的文字为类与类之间的消息,由用户操作引发,由当前UI类解释并发送,由接受消息的类解释并执行。该类更加深入地描述了上一节中的用例模型。

4.2 非功能需求

结合Android手机的特性和使用场景,对系统提出如下非功能需求: 1) 可用性

34

武汉理工大学毕业设计(论文)

a) 速度快:车牌识别时间不超过1s;在有1000条左右数据项的情况下,载入车辆

信息列表和车辆登记记录列表的时间不超过0.5s

b) 准确性:在车辆前方5m处拍摄车辆整车照片,车牌识别准确率达50%以上 2) 易用性

a) 业务流程简单,无学习成本 b) 摇一摇,即可快速进入车辆登记模式 c) 重要功能一键可达

d) 即编即达,保证用户编辑的数据不致意外丢失;提供重置编辑、撤消编辑等功

3) 安全性

a) 所有车辆照片存储在SD卡特定的目录下(可设置隐藏),用户不致错误删除,

并可定期备份

b) 数据库定期在SD卡备份 c) 可与同步服务器同步数据 4) 健壮性

a) 妥善处理SD卡不可用、文件不存在等异常 5) 可移植性

a) 适应99%的Android设备,适应各种分辨率 b) 可支持多种地区/语言

c) 安装方便,无需另行下载相关依赖数据 6) 可维护性

a) 日志记录,便于跟踪、诊断缺陷或失效原因

35

武汉理工大学毕业设计(论文)

5 系统设计、实现与测试

5.1

系统的设计

系统的设计包含总体设计和详细设计,我们在此仅讨论总体设计。总体设计中,将依据需求分析中获取的交互图发现与抽象类,并设计其属性和方法,以实现程序逻辑。同时提取出实体及实体之间的关系,确定实体的属性,以设计数据库模式。

5.1.1 程序逻辑设计

经对需求分析中获取的交互图的分析,发现类“车辆信息库”与类“车辆登记单”有几乎完全相同的交互行为。从根源分析,二者的区别仅在于:

1)用户界面的标题和菜单文本略有不同; 2)列表项绑定的数据以及列表项的布局不同; 3)相应地,对列表项的操作也略有不同。

于是可以抽象出一个父类——“车辆列表”,负责类“车辆信息库”与类“车辆登记单”相同的业务逻辑;类“车辆信息库”与类“车辆登记单”继承类“车辆列表”,重写用户界面的标题和菜单文本等属性,重写列表绑定和列表项布局,重写菜单即可。

除此之外,为了实现前述“摇一摇”快速查询/登记车辆信息的特性,还让类“车辆列表”继承于一个能够接收并响应手机加速感应的列表类。用例“浏览车辆信息库”和“浏览车辆登记单”,最后设计出的类图如图21。

36

武汉理工大学毕业设计(论文)

ViqShakeableListActicity{abstract} ---####++mSensorManagermVibratorSHAKE_THRESHOULDshakeAlreadyResponded: SensorManager: Vibrator: int: boolean = 16: void: void: void: void: voidonCreate (Bundle savedInstanceState)onResume ()onPause ()onAccuracyChanged (Sensor sensor, int accuracy)onSensorChanged (SensorEvent event)...ViqBaseShakeableListActivity{abstract} -##############++######TAGmDefaultTitlemForwardButtonTextmForwardClassmWriteableTableNamemListViewmMatchesViewmQuickSearchEnabled<>: String: String: String: Class: String: ListView: TextView: boolean = \"ViqBaseShakeableListActivity\" = false: void: void: void: void: void: void: void: boolean: boolean: void: void: void: String: void: void<><>onCreate (Bundle savedInstanceState)onRestart ()onStart ()onResume ()onPause ()onStop ()onDestroy ()onCreateOptionsMenu (Menu menu)onOptionsItemSelected (MenuItem item)onListItemClick (ListView l, View v, int position, long id)refreshNewQueryButtonText ()toggleQuickSearchMode ()getFilter ()deleteItem (final long id, String caption)refreshListView ()...VehicleInfoListActivity--#++##TAGmContextMenuInfo<>: String: AdapterContextMenuInfo = \"VehicleInfoListActivity\": void: void: boolean: void: void--#++##TAGmContextMenuInfo<>VehicleQueryListActivity: String: AdapterContextMenuInfo = \"VehicleQueryListActivity\": void: void: boolean: void: void<><>onCreate (Bundle savedInstanceState)onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo)onContextItemSelected (MenuItem item)onListItemClick (ListView l, View v, int position, long id)refreshListView ()...<><>onCreate (Bundle savedInstanceState)onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo)onContextItemSelected (MenuItem item)onListItemClick (ListView l, View v, int position, long id)refreshListView ()... 图21 用例“浏览车辆信息库”和“浏览车辆登记单”实际的类图

除这两个用例具有巨大的相似性,发生了继承关系之外,其他用例均以一个相对独立的类、监听器、回调函数或方法实现。本系统中分析出来的主要的类如下:

1)车辆查看页

类VehicleItemViewActivity,负责从数据库获取指定ID或车牌号的车辆的信息及其登记记录列表,显示在用户界面上,接收用户对车辆信息和车辆登记记录的菜单操作。

2)车辆信息编辑页

类VehicleInfoEditActivity,负责从数据库获取指定ID的车辆的信息,显示在用户界面上,接受用户的编辑,妥善暂存、保存用户的编辑。

3)车辆登记记录编辑页

类VehicleQueryEditActivity,负责从数据库获取指定ID的车辆登记记录,显示在用

37

武汉理工大学毕业设计(论文)

户界面上,接受用户的,妥善暂存、保存用户的编辑。

4)车辆照片异步缓冲与加载线程

类ViqCachedImageFetcher,负责将指定路径的图像文件绑定到指定的图像视图中。为了加快有大量图像绑定车辆信息库和车辆登记单的显示速度,并极大地减少内存消耗,将使用新的线程执行图像绑定,并使用较小的图像缓存而非原图作为图像视图的图像源。

5)数据库适配器

类ViqSQLiteOpenHelper,继承于类android.database.sqlite.SQLiteOpenHelper,负责数据库的创建、升级和本项目中各大UI类对数据库的访问。

5.1.2 数据库设计

系统涉及两个表:

1)车辆信息库(车牌号,车型,车架号,车主姓名,车主电话,车主性别,车主出生年月,车主驾照号,车辆备案照片,备注)。其中车牌号为候选码。因为车主信息并没有其他的用例,并没有为车主信息建立一个专用的表。

2)车辆登记单(车牌号,时间,地点,车辆登记照片,备注)。其中(车牌号,时间,地点)为候选码;车辆登记照片指登记时拍摄的照片。值得注意的是,车辆登记单的车牌号并不参照车辆信息库的车牌号,因为根据业务需求,所登记车辆并不一定在车辆信息库中存在;如果不存在,还可以随时将该车信息加入车辆信息库。

表“车辆信息库”中的所有信息,将与类“车辆信息库”列表中的每一项完好对应。然而,为了方便用户在浏览车辆登记记录时清楚地知道登记车辆的车主姓名及联系电话等信息,类“车辆登记单”列表中的每一项中的数据,除来自表“车辆信息库”中的一行之外,来以车牌号为连接条件,关联了表“车辆信息库”中相应车辆的车主姓名和联系电话等信息。因此,我们需要创建一个视图“车辆登记信息单”,将之与类“车辆登记单”绑定:

车辆登记信息单(车牌号,车主姓名,车主电话,时间,地点,车辆登记照片,备注)。其中备注字段来自于车辆登记单。

5.2 系统实现

为更加清楚地显示项目的实现轮廓,首先给出项目的目录结构,包括类的组成(src目录)、引用的Jar包(lib目录)和So共享库(lib/armeabi目录)、XML资源文件(res目录)等。如图22。

38

武汉理工大学毕业设计(论文)

图22 项目目录结构

5.2.1 支撑条件

5.2.1.1

支撑平台

(1)开发平台

1) Eclipse IDE for Java Developers最新版本。本项目采用Indigo Service Release 2。 2) Android ADT最新版本,本项目采用ADT-16.0.1。

3) Android SDK最新版本,本项目采用android-sdk_r18-windows.zip。

4) Android NDK最新版本(非必须),本项目采用android-ndk-r8-windows.zip。 5) 真实Android设备(可使用模拟器替代),本项目采用小米手机MI-ONE PLUS。 (2)运行平台 1) 最小SDK版本:

本系统最小SDK版本为API 10(Android 2.3.3)。这是目前为绝大多数手机所支持的版本。本项目面向Android设备开发,为适应各种Andrroid手机,须遵循Android应用设计与设备独立的标准,主要指标如下:

39

武汉理工大学毕业设计(论文)

a) 用户界面元素的大小和位置使用相对比例(使用android:weight等属性)或分

辨率独立单位(dp、sp等单位),对Android手机的各种分辨率都有较好的支持。

b) 用户界面的文本,使用资源文件res/values/strings.xml集中定义并引用,可迅

速增加新语言(提供相应的strings.xml副本即可)。

c) 为支持国际化合作开发,项目源代码中不存在任何全角字符,注释全部采用

英文。

2) 硬件使用

a) 相机(非必须),用于拍摄车辆照片,并识别出车牌号。可手工输入车牌号。 b) GPS(非必须),用于自动获取当前地理坐标,车辆登记记录中的数据项。可

手工填写或不填。

c) 硬件感应(非必须),用于实现“摇一摇”快速登记车辆功能。可通过点击按

钮或选择菜单进入登记车辆功能。

d) 移动网络或Wi-Fi(非必须),用于辅助GPS定位,将地理坐标转化为实际地

点名,以及同步车辆数据。

e) 通话与短信(非必须),用于快速拨打车主电话、发送车辆信息。 3) 权限使用

a) 写SD卡(WRITE_EXTERNAL_STORAGE),用于保存车辆照片。 b) 通话(CALL_PHONE)。 c) 短信(SEND_SMS)。

d) 振动(VIBRATE),用于在识别出“摇一摇”动作时给出振动反馈。 e) 互联网(INTERNET)。

f) 获取非精确(ACCESS_COARSE_LOCATION)的地点和精确的地点

(ACCESS_FINE_LOCATION)。

5.2.1.2

支撑代码库

(1)tesseract-android-tools

开源项目tesseract-android-tools中jin目录下是图像识别库Tesseract-OCR和图像处理库Leptonica的C/C++本地代码。通过Android NDK编译二者,生成专用于Android设备ARM处理器的共享库libtess.so和liblept.so。当然,也可以从本项目在谷歌代码上的代码库中取得,以免去重新编译的麻烦。将这两个共享库复制到项目lib/armeabi目录下。

项目tesseract-android-tools使用JNI技术调用上述本地代码。其他项目要调用上述本地代码,直接引用tesseract-android-tools生成的Jar包tesseract-android-tools.jar即可。建议将Jar包存放在lib目录下。

(2)javacv

开源项目JavaCV的引用类似。项目JavaCV的编译,对平台的要求较多。这里直接引用其Jar包javacv.jar。

40

武汉理工大学毕业设计(论文)

JavaCV采用JavaCPP技术访问本地代码。JavaCPP访问本地代码的技术尚未集成在Android代码栈中,因此须在每个使用它的项目中引用;其Jar包是javacpp.jar。

项目JavaCV为完整地支持各种图像、视频的处理,引用了许多共享库。本项目中,只需要使用

libopencv_core.so,libjniopencv_core.so,libopencv_imgproc.so,

libjniopencv_imgproc.so,libopencv_highgui.so,libjniopencv_highgui.so,libtess.so,liblept.so八个共享库即可。 5.2.1.3

支撑数据

项目用到了图像识别,前文详细讲述了专用于中华人民共和国机动车号牌的语言包的训练方法。该语言包名为“cnl.traineddata”,大小为515KB,需要放在SD卡上,图像识别时读取。

为了最大限度地降低用户使用本系统的难度,本项目不使用普遍使用的从网络下载SD卡上所需资源文件的方法,而是将它直接放置在项目assets目录下。图像识别过程中,如果检测到SD卡上不存在该语言包,则自动将其复制到SD卡特定目录(本项目使用Tesseract-OCR语言包标准目录/sdcard/tesseract/tessdata/)下。

5.2.2 类的实现

编写Android应用,很大部分工作在于与用户的交互,UI类占很大的比重。 UI类,如Activity、Activity,以及用户拓展了的UI类,主要的实现流程如下: 1)重写Activity被创建时的回调函数onCreate(),做以下工作:

a) 调用父类的onCreate()方法;

b) 通过调用getIntent()获得启动本Activity的Intent对象,获得本应用所需的参

数,如车辆ID、车牌号等;

c) 设置内容视图(setContentView),指定描述用户界面的资源文件;

d) 获得对资源文件中每个视图元素(View)的引用,待后面对它们进行操作; e) 设置按钮等视图元素的监听事件。

2)重写Activity开始能与用户交互时的回调函数onResume(),做以下工作:

a) 从数据库或文件重新读入数据,更新视图元素的显示。

3)重写创建上下文菜单onCreateContextMenu()和用户选择上下文菜单onContextMenuSelected()时的回调函数,设置上下文菜单及菜单被点击时相应的操作。

4)重写Activity即将失去与用户的交互能力(如成为其他UI元素的背景,或用户启动别的应用,或用户按Home键;用户可能永远也不再当前Activity,因此须保存数据)时的回调函数onPause(),保存用户花时间创建的数据。

5)重写Activity即将被销毁时的onDestroy()回调函数,关闭数据库连接和程序启动时启动的服务。

以类“VehicleItemViewActivity”为例,其代码和轮廓视图如图23。

41

武汉理工大学毕业设计(论文)

图23类“VehicleItemViewActivity”的实现

其他类,包括Android提供的API和用户自定义的类,遵循高内聚、低耦合的原则以及其他一些规范即可。

5.2.3 数据库模式

在Android中,SQLite数据库作为应用程序永久保存数据的重要机制,得到了Android的强大支持。应用程序访问SQLite数据库,无需事先配置好数据库,然后指定连接字符串访问(SQLite本身是零配置、零服务的);相反,应用程序像进行普通文件操作一样,通过代码创建数据库,更新数据库,升级数据库。

数据库设计一节中已经描述了本应用中数据库的表和视图的结构。在对表的描述中,提到了“候选码”而非“主码”是因为,我们将使用一个整型自增片段作为主码,以与更加方便地与列表适配器(ListAdapter)相匹配(见“ROWID和整型主码”一小节的描述),在一定程度上提升代码编写效率和程序运行效率。数据库的模式创建如下:

CREATE TABLE Info(_id, licence, type, vin, name, phone, gender, birth, driving_licence, note, photo); CREATE TABLE Query(_id, time, place, note, photo, _licence); 42 武汉理工大学毕业设计(论文)

CREATE VIEW QueryInfo AS SELECT Query._id AS _id, _licence AS licence,name,phone,time,place,Query.note AS note,Query.photo AS photo FROM Query LEFT OUTER JOIN Info ON _licence=licence 5.3 运行与测试

5.3.1 运行演示

应用程序在开发设备上运行良好,能满足需求分析中所研究各大使用场景和用例的基本需求。下面将结合需求设计中的几个用例给出具有代表性的程序运行截屏。

(1) 浏览车辆信息库

如图24所示,“车辆信息库”页以列表形式显示了所有共52条车辆的信息,以车牌号排序。列表项左侧是车辆的备案照片,右侧是车牌号、车主姓名与电话等信息。

单击“车辆登记单”按钮,可切换至“车辆登记单”页面;单击“查询/登记车辆”按钮,可切换至“查询/登记车辆”页面;单击列表项,可切换至“查看车辆”页面。

单击“快速查找”按钮,标题栏将变为可编辑状态,可输入任一已知字段中的文本片段进行查找,列表项实时更新。如图26所示,有3条记录中包含有关键词“45”。

长按列表项,将弹出上下文菜单,如图27所示。可对车辆信息进行查看(切换至“查看车辆”页面)、编辑、删除操作,可快速联系车主,可短信发送车辆信息,可复制部分或全部字段至剪切板。

图24 车辆信息库 图25 快速查找 图26 快速查找

43

武汉理工大学毕业设计(论文)

图27 车辆信息库列表项的上下文菜单 图28 查看车辆 图29 编辑车辆信息

图30 删除车辆信息 (2) 浏览车辆登记单

图31 联系车主 图32 浏览车辆登记单

如图32所示,“车辆登记单”页以列表形式显示了所有共53条车辆登记记录,以登记时间逆序排序。列表项中,左侧是车辆的登记照片,右侧是所识别或输入车牌号、通过车牌号所查得的车主姓名和电话等信息。车辆登记单还特别记录了登记的时间和地点,并且时间以相对时间(如“刚刚”“35分钟前”等)格式显示,在部分场景中有较大的用处。

44

武汉理工大学毕业设计(论文)

“浏览车辆登记单”页面中的操作,和前述“浏览车辆信息库”页面的操作十分类似,这里不再赘述。

(3) 查看车辆

如图33所示,“查看车辆”页显示了指定车辆的信息以及其所有登记记录。同样可对该车辆的登记记录实施编辑、删除操作。同时,还可以新建登记记录,如图34;系统将自动填入登记的时间和经纬度信息。

图33 查看车辆 图34登记车辆 图35 登记信息立即显示在了登记记录列表中

(4) 查询/登记车辆

如图35所示,“查询/登记车辆”页取得用户拍摄或选择的车辆照片,自动检测到车牌并对其图像进行加工,最后完成识别并等待用户确认。

用户确认后,程序将保存此次登记,并根据所得车牌号码查找车辆信息库。如果找不到,“查看车辆”页上方将不显示车辆的信息,并允许用户建立该车的车辆信息。

45

武汉理工大学毕业设计(论文)

图36 查询/登记车辆 图37 成功登记的车辆 图38 创建车辆信息

图39 成功创建车辆信息

5.3.2 测试

软件的测试分为白盒测试和黑盒测试两大方法。对Android应用进行白盒测试,Android API提供了ActivityInstrumentationTestCase2等测试专用的类,用以模拟用户和系统对应用的操作或调用,对应用实施快速自动的测试。

46

武汉理工大学毕业设计(论文)

本项目所选取的是手工测试。针对前述各个用例,可以灵活地输入各种测试数据,走遍各个可能的路径,及时发现问题并予以解决。边界条件如对列表项的第一项、最后一项实施编辑或删除,函数中的空参数、零值、零长字符串,异常如GPS不可用、SD卡不可用、文件不存在等,程序都做了充分的考虑和妥善的处理。此外,代码中关键部分都设置了日志记录,遇到问题可迅速定位并解决。

针对关键技术车牌识别,由于本项目目前的主要工作暂只是将车牌识别技术在Android上实现,而没来得及进行深入的优化,因而测试工作也不够充分。目前,识别超过2MB的车辆图片可能会导致内存用尽异常;对部分类型车牌的识别率不够可观。相信通过训练更好的车辆识别语言包,以及优化车牌检测算法和图像处理算法,本系统的车牌识别率能与专用ALPR设备相媲美!

47

武汉理工大学毕业设计(论文)

6 结语与后续计划

本论文的撰写,经历了大量的前期准备。阅读并翻译了大量的英文文献,特别是Android官方网站Android开发者上介绍Android基础及API的文档。关于车牌识别在Android上的实现,参考了作者Ahmad Gull Liaqat于2011年完成的硕士学位论文《Mobile Real-Time License Plate Recognition》,从中提取了大量宝贵的素材,并与Ahmad本人进行了多次的邮件交流。此外,还对开源项目Tesseract-OCR和JavaCV作出了一定的研究,利用二者促成了本项目的快速构建。最终,较好地实现了一个基于Android平台的车辆信息查询系统,实现了Android平台上的车牌识别,并将后者应用到了前者当中。

本论文介绍了上述工作中的核心内容,描述了系统的开发过程,展示了所取得的成果。它对该系统进一步的完善,以及其他从事类似工作的开发者,具有一定的指导意义。

论文的不足之处在于,1)未就车牌识别问题进行充分的研究,包括车牌类型的适应性(机动车车牌和小车车牌,前方车牌和后方车牌)、车牌照片的适应性(拍摄的角度与倾斜、光线与背景干扰);2)未实现车辆数据库的同步,包括手机与服务器、手机与手机的数据同步。它们在接下来的工作中加以完善。

至此,以车辆识别为特性的基于Android平台的车辆信息查询系统的开发工作到达了一个重要的里程碑。

它不是终点,相反是新的起点。我们已经将本论文背后的项目放入了谷歌代码托管,将接受来自世界各地开发者的关注与贡献,并鼓励大家自由使用。接下来,我们将着手提升车牌识别准确率,并实现车辆数据库的同步。争取在不远的未来,本系统能广泛运用到现实生产生活中去!

48

武汉理工大学毕业设计(论文)

参考文献

[1] 公安部.GA 36-2007 中华人民共和国机动车号牌, 2007 [2] 大楚网.武汉黑的士——大楚网新闻频道,

http://hb.qq.com/zt/2008/heidishi/heidishi.htm, 2012-5-26

[3] 百度百科.移动计算_百度百科, http://baike.baidu.com/view/95305.htm, 2012-5-19 [4] Android开发者.What is Android? | Android Developers,

http://developer.android.com/guide/basics/what-is-android.html, 2012-5-19 [5] 英文维基百科.Android (operating system) - Wikipedia, the free encyclopedia,

http://en.wikipedia.org/wiki/Android_%28operating_system%29, 2012-5-19 [6] Android开发者.Application Fundamentals | Android Developers,

http://developer.android.com/guide/topics/fundamentals.html, 2012-5-19 [7] 英文维基百科.Java Native Interface - Wikipedia, the free encyclopedia,

http://en.wikipedia.org/wiki/JNI, 2012-5-19 [8] Android开发者.JNI Tips | Android Developers,

http://developer.android.com/guide/practices/design/jni.html, 2012-5-19 [9] 英文维基百科.Java Native Access - Wikipedia, the free encyclopedia,

http://en.wikipedia.org/wiki/Java_Native_Access, 2012-5-19

[10] 谷歌代码托管.Issue 11099 - android - JNA on Android desired - Android - An Open

Handset Alliance Project - Google Project Hosting,

http://code.google.com/p/android/issues/detail?id=11099, 2012-5-19 [11] SQLite官方主页.SQLite Home Page, http://www.sqlite.org/, 2012-5-20 [12] Android开发者.Data Storage | Android Developers,

http://developer.android.com/guide/topics/data/data-storage.html#db, 2012-5-20

[13] SQLite官方主页.Features Of SQLite, http://www.sqlite.org/features.html,

2012-5-20

[14] SQLite官方主页.Datatypes In SQLite Version 3,

http://www.sqlite.org/datatype3.html, 2012-5-20 [15] SQLite官方主页.SQLite Query Language: CREATE TABLE,

http://www.sqlite.org/lang_createtable.html#rowid, 2012-5-20 [16] Android开发者.CursorAdapter - Android SDK | Android Developers,

file:///D:/viky/android/android-sdk/docs/reference/android/widget/CursorAd

49

武汉理工大学毕业设计(论文)

apter.html, 2012-5-20

[17] Github代码托管.netjunki/jna-android, https://github.com/netjunki/jna-android,

2012-5-19

[18] 谷歌代码托管.javacpp - The missing bridge between Java and native C++ - Google Project

Hosting, http://code.google.com/p/javacpp/, 2012-5-19 [19] 英文维基百科.Image processing - Wikipedia, the free encyclopedia,

http://en.wikipedia.org/wiki/Image_processing, 2012-5-20

[20] OpenCV维基.Welcome - OpenCV Wiki, http://opencv.willowgarage.com/wiki/, 2012-5-20

[21] 谷歌代码托管.javacv - Java interface to OpenCV and more - Google Project Hosting,

http://code.google.com/p/javacv/, 2012-5-20

[22] 英文维基百科.Haar-like features - Wikipedia, the free encyclopedia,

http://en.wikipedia.org/wiki/Haar-like_features, 2012-5-20

[23] 谷歌代码托管.tesseract-ocr - An OCR Engine that was developed at HP Labs between 1985

and 1995... and now at Google. - Google Project Hosting,

http://code.google.com/p/tesseract-ocr/, 2012-5-20

[24] 谷歌代码托管.TrainingTesseract3 - tesseract-ocr - How to use the tools provided to train

Tesseract3 for a new language. - An OCR Engine that was developed at HP Labs between 1985 and 1995... and now at Google. - Google Project Hosting,

http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3, 2012-5-20 [25] 谷歌代码托管.Issue 557 - tesseract-ocr - Warning no protos/configs for in

CreateIntTemplates() when use command mftraining - An OCR Engine that was developed at HP Labs between 1985 and 1995... and now at Google. - Google Project Hosting, http://code.google.com/p/tesseract-ocr/issues/detail?id=557, 2012-5-20 [26] 谷歌代码托管.tesseract-android-tools - Android APIs for the Tesseract OCR library -

Google Project Hosting, http://code.google.com/p/tesseract-android-tools/, 2012-5-20

[27] Android开发者.Managing Projects | Android Developers,

http://developer.android.com/guide/developing/projects/index.html#LibraryProjects, 2012-5-20

[28] Android开发者.Android NDK | Android Developers,

http://developer.android.com/sdk/ndk/index.html, 2012-5-20

[29] 谷歌代码托管.Issue 199 - javacv - Hard to use JavaCV with Tesseract OCR and others on

Android - Java interface to OpenCV and more - Google Project Hosting,

50

武汉理工大学毕业设计(论文)

http://code.google.com/p/javacv/issues/detail?id=199, 2012-5-20 [30] Android开发者. Wi-Fi Direct | Android Developers,

http://developer.android.com/guide/topics/wireless/wifip2p.html, 2012-5-27

51

武汉理工大学毕业设计(论文)

致 谢

毕业论文即将完成,我的学生生涯也要告一段落了。完成此论文,我怀有极大的成就感。借此机会,我要对四年来帮助过我的人表示深深的感谢。没有他们,我将无法走到这一步。

首先,我要感谢我的指导老师杨青,以及过去二年给我帮助的刘洪星教授,感谢他们持续不断的引导、支持与关心。他们的建议与评论对我的工作起到了十分关键的作用。同时,他们的放心与信心让我有足够的自主和自律,让我对工作抱有极大的方向感、责任感与使命感,从不敢懈怠。

其次,我要感谢在本次毕业设计过程中给过我大量指导的Ahmad Gull Liaqat。他半年前发表的硕士论文《移动实时车牌识别》为本项目车牌识别的实现提供了重要的指导;他本人的热心帮助促成了本项目车牌识别模块的完整实现。

同样,我要感谢我的家人和同班同学。感谢家对我的爱与放飞,让我像一只风筝自由翱翔蓝天;感谢同学们对我的理解与支持,当我忙的时候能够为我分担部分工作,并能宽容我的部分疏忽;感谢家人和同班同学给我营造的温馨和谐的氛围,让我有足够的勇气与力量追求一流、追求幸福,平和,从容。这些都是我存在的意义。

2012年5月27日

52

武汉理工大学毕业设计(论文)

53

因篇幅问题不能全部显示,请点此查看更多更全内容

Top