《基于Android火车票查询系统 毕业论文.doc》由会员分享,可在线阅读,更多相关《基于Android火车票查询系统 毕业论文.doc(46页珍藏版)》请在三一办公上搜索。
1、目 录目 录8摘 要10Abstract111绪论121.1问题描述与项目动因121.2篇章结构132Android移动操作系统142.1移动计算142.2Android技术背景142.2.1Android的特性142.2.2Android架构152.3Android平台本地应用的开发162.3.1虚拟机之上的Java应用162.3.2Linux之上的C/C+本地代码162.4Android平台数据的存储与同步172.4.1嵌入式关系数据库管理系统SQLite172.4.2Android平台的数据同步193需求分析203.1图像处理203.1.1OpenCV203.1.2JavaCV203.2
2、车牌探测213.2.1将原始图像转化为灰阶图像223.2.2灰阶图像的平滑与增强处理223.2.3灰阶图像转化为二值图像223.2.4从二值图像中提取轮廓233.2.5基于边缘检测的车牌探测233.3车牌字符分割243.4车牌字符识别253.4.1Tesseract OCR引擎253.4.2车牌语言的训练253.4.3Tesseract库在Android中的使用274需求分析与设计294.1功能需求294.1.1用例模型294.1.2交互图324.2非功能需求345系统设计、实现与测试365.1系统的设计365.1.1程序逻辑设计365.1.2数据库设计385.2系统实现385.2.1支撑条件
3、395.2.2类的实现415.2.3数据库模式425.3运行与测试435.3.1运行演示435.3.2测试466结语与后续计划48参考文献49致 谢52摘 要本文基于Android移动操作系统,集成了Dom4j、SQLite等几大开源技术,设计并实现了一个基于Android平台的火车票在线查询系统。软件可下载到手机上,实现了在任何地方都能查询火车时刻表信息。该软件是适应时代发展的需求,方便人们的日常出行,提升工作效率而开发设计的,所开发的系统功能都包括按照发车站和到达站进行查询,按照车次进行查询,点对点天气查询以及周边售票查询。论文主要学习、研究基于Android平台的火车时刻表信息查询系统的
4、技术实现,具体内容包括:Android技术背景,Android平台本地应用的开发,Android平台数据的存储与同步,Android平台上地图定位以及Android平台获取网络xml解析技术的实现。通过本对课题的研究、调查与实现,归纳出了Android系统在火车时刻表方面的典型应用场景和用例;介绍了与之相关的理论和技术基础;详细讲解了这些理论和技术基础在本系统中的实践与运用;围绕解析网络信息课程,研究了在Android系统上如何将解析到的xml数据抽丝剥茧地显示在布局上以及Android上内置的SQLite嵌入式数据库技术;围绕软件更新、数据统计和意见反馈,研究了如如何利用友盟手机平台实现软件
5、的管理推广和盈利方式。本文的特色在于:1)将基于Android火车信息查询成功实现;2)集成创新,百度地图等技术,源码易于获得且允许商业应用;3)本课题亦以开源项目的形式开展。关键词:Android;火车票信息查询; SQLite; Dom4j解析; WebServerAbstractThis thesis implements a Train Tickets Query (TTQ) system based on Android mobile operating system, and integarated with Dom4j, SQLite and several open sourc
6、e technologies. This software can be downloaded to mobile phones and also realize to query the train schedule informations at any time in any places. Moreover, it adapt to the development of the modern era and offer a convenient tool when they want to go out. And then it have an effect on improving
7、work efficiency. The system function can allow you to query by the originating station, the terminal station, the train number, the weather, and the ticket office.In this thesis, we studied the implementation of TTQ system based on Android. It mainly includes: the background of Android; the developm
8、ent of Android local application; the storage and sync of data on Android; the orientation of map on Android; and the implementation of using network to analyze xml on Android.After investigating, studying and implementing of this degree project, this thesis has concluded some typical application sc
9、enarios and use cases on railway time table ; introduced related theories and technological base; explained the practice and application in detail; on data sync, studied solutions to syncing data among multiple Android terminals; on network information courses, studied the way to display the xml in
10、detail and effectively implement the technology of SQLite; around the software update, data statistics and feedback, discuss the way to promote and profit the software by using the management of mobile platforms.Features of this thesis: 1) Making TTQ implemented on Android. 2) integrating with innov
11、ation, baidu map technology , and so on. And the source codes are easy to obtain for business applications; 3) This topic is carried out in the form of an open source project. Key Words:Android; Train Tickets Query; SQLite; Dom4j; WebServer 1 绪论随着国民经济的发展,信息时代已经来临。手机应用用于火车时刻信息查询为查询类应用带来了从未有过的动力和机遇,为火
12、车时刻管理领域的飞速发展提供了无限的潜力。采用手机终端查询火车时刻信息已经代替了以往用计算机网页查询已成为科技化和现代化的重要标志,给人们的出行带来了明显的经济效益和社会效益。这类应用普遍存在场地不固定、需求变化快等特点,传统基于台式计算机的火车时刻表查询系统很难适应。即使努力适应,建设传统车辆管理系统,需要有专用的摄像装置;车辆的行驶路径和停放位置须服从摄像装置的要求;需要设置护栏,却又容易导致车辆停放困难。这此无疑增加了车辆信息管理的成本,制约了车辆信息数字化的进程。移动智能终端的普及,让移动计算正取代传统桌面计算成为越来越重要的信息处理方式。Android移动操作系统在移动计算平台中处于
13、领先的地位。配备打电话、GPS和网络功能的Android终端尤其是Android手机,完全能在火车时刻表查询系统中扮演重要的角色,其中最重要的是车站信息的查询、车次信息查询,其次重要的是天气信息查询。Android终端在扮演这一角色的过程中,有两大问题需要解决:一、有限的计算能力,如何快速准确地获取网络火车时刻表数据,以的将信息解析获取最终以简洁的格式显示在手机上;二、收藏功能数据库的实现,在网络不可靠的情况下,如何获取与存储数据。关于Android平台上的车牌识别,在本系统中,我们通过使用JavaCPP和JNI技术实现了对OpenCV和 Tesseract OCR本地代码库的调用;为了准确识
14、别出车牌号码,我们通过Tesseract训练出了中华人民共和国机动车号牌1的语言包。关于Android平台上数据的存储与同步,在本系统中,我们采用了Android内建的SQLite技术进行数据的结构化存储与访问;特别针对Android 4.0及以上版本,讨论了端对端Wi-Fi直连通讯技术的实现。1.1 问题描述与项目动因火车时刻查询,包括站点之间的查询、车次的查询、城市天气的查询以及用户周边火车票代售处的查询。这些信息在实际典型场景中的应用,举例如下:1)火车站点查询管理目前,随着现在社会的发展,我们的生活也朝着电子化不断发展,如出行需用火车的频率也越来越普及,经济的不断发展避免不了人们要到一
15、些不熟悉的城市出差或者旅行,但是当你对于该怎么去而不知所措的时候,那出门就会变得举步维艰,无所适从。用电脑上网查询,对于一些比较发达的城市也许不算什么,但是对于一些偏远的地区,周边没有提供电脑上网的条件或者场所,那就会有不必要的麻烦。此时若手机中安装有本火车时刻表查询系统的软件此麻烦迎刃而解,用户只需打开手机的网络就能随时随地的查询到与自己出行相关的火车时刻信息,而不用顾及自己身在何地是否有计算机。帮助出行人士方便、高效的安排自己的行程。2)天气的预报当今社会的国民经济之所以能够持续、快速、健康的发展和经济建设、人民生活、天气预报都有着密切的联系。天气预报的技术水平随之增加,在防灾减灾和国民经
16、济建设中发挥了巨大作用。在火车时刻查询中增加天气预报的功能不仅给人们带来了很大的帮助,而且为社会也做了件有意义的事情。对于人们来说,坐火车出行无非就是旅行或者是探亲,选择一个适合自己的天气出行不仅对自己的安全有所保障还对社会公共安全减少一点压力。对于社会来说,保证人们的出行安全是社会的责任。如果大雪大雨的天气还是有很多的乘客,一些纠纷一些人与人之间的事故难免会发生。有了天气预报功能,人们在预定火车票的时候可以选择避开不好的天气,就会减少大量的乘客,这样也为社会的治安工作提供了很大的帮助。在手机火车信息查询中加入天气预报功能方便了乘客的查询需求,也避免了一些乘客忘记天气变换对出行的影响。3)地图
17、定位服务拥有地图的定位功能是很多软件的重要业务内容。使用本系统的提供的百度地图定位服务,用户能能够准确的了解到自身所在的城市位置,方便用户使用站点查询火车时刻表信息。该服务还能为用户提供周边五千米内的火车票代售处,方便用户在不熟悉的城市或者地区快速的买到车票,从而更加高效的利用时间上述应用场景要求移动智能设备有网络数据查询、地图定位、自动记录时间和地点、快速天气信息、保存车次信息等功能。此外,数据备份、电话订购火车票、与友盟平台的软件更新和意见反馈,也是隐含的功能需求。本项目即致力于设计并实现一个基于Android平台的火车票信息查询系统,以满足上述应用场景的需求。1.2 篇章结构本论文正文部
18、分围绕以下结构展开:第二章介绍Android移动操作系统,重点介绍了Android平台本地应用的开发和数据的存储与解析技术。第三章介绍解析网络数据的理论、技术以及在Android平台上的实现。它是本项目的创新点和核心工作之一。第四章介绍系统需求的分析与设计。第五章介绍系统的设计、实现与测试。第六章总结全文,并对接下来的工作提出展望与规划。2 Android移动操作系统2.1 移动计算移动计算是随着移动通信、互联网、数据库、分布式计算等技术的发展而兴起的新技术。移动计算技术将使计算机或其它信息智能终端设备在无线环境下实现数据传输及资源共享。它的作用是将有用、准确、及时的信息提供给任何时间、任何地
19、点的任何人。这将极大地改变人们的生活方式和工作方式3。手持移动设备,或手机,特别是智能手机,将是由传统桌面计算向移动计算或云计算这一转变过程中的主力军。随时随地可用,传感器丰富等相对传统桌面计算机的突出优点,为智能手机改变人们的工作与生活提供了各种可能。智能手机将逐步发展成人们眼、耳、脑以及不存在感官的延伸,帮助人们获取、处理、存储与呈现信息,帮助人们作出决定,展现给人们美好的事物,引领人们更加智慧与舒适地生活。移动平台是目前和将来相当一段时间应用部署的重要平台。2012年年初,苹果应用商店已经拥有了超过53万款应用,而Google Play所能提供的应用数目也已突破了40万大关,涵盖了游戏、
20、效率、社交、购物、交通、体育、图书与工具书等等领域,渗入了生活的方方面面。下载量上,仅以Android以例。最高下载量已达5亿(谷歌地图),相当多的免费应用的下载量在十万级别以上,收费应用也在万级别以上(具体请参照Google Play)。一款受欢迎的应用的市场价值十分巨大,而且这一市场才刚刚起步。2.2 Android技术背景Android是用于移动设备上的一个包含一操作系统,一系列中间件,以及部分关键应用软件栈。Android SDK网站提供了在Android平台上使用Java编程语言开发应用程序所必须的工具和API4。2.2.1 Android的特性l 应用框架,实现了组合的重用与替换l
21、 Dalvik虚拟机,专为移动设备优化l 集成的浏览器,基于开源的WebKit引擎l 优化的图形,由一个定制的2D图形库驱动,3D图形基于OpenGL ES 1.0规范(硬件加速可选)l 媒体支持,支持常用音频、视频以及图像格式(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)l GSM通话(依赖硬件)l 蓝牙,EDGE(增强型数据速率GSM演进技术),3G,以及Wi-Fi(依赖硬件)l 相机,GPS,指南针,加速计(依赖硬件)l 丰富的开发环境,包括一个设备模拟器,测试工具,内存和性能分析,以及用于Eclipse IDE的一个插件2.2.2 Androi
22、d架构图1 Android架构图Android架构由上至下分四层,如图1。描述如下:l 应用层:包括由系统默认提供了桌面、联系人、通话、浏览器等基础应用,以及由广大开发人员开发、可下载安装的拓展应用。拓展应用访问下层应用框架层方面,和由厂商提供的基础应用一样,没有任何尊卑之别。l 应用框架层:应用开发基本的API,提供包管理、通话管理、资源管理、位置管理、通知管理、Activity管理,窗口管理、内容提供设施、视力系统。l 库:用C/C+写成。提供SGL底层2D绘图引擎,安全套接层,嵌入式标准C库,OpenGL 3D绘图,FreeType字体,浏览器核心,用户空间显示管理,媒体框架,以及轻量级
23、SQLite关系型数据库。l 运行环境:与JRE极其相似。核心包包含了在Java开发中常用的类库如IO、Utility等;Dalvik虚拟机类似JVM,同样也是专为Android定制,针对手持设备,在存储、计算以及功耗等方面作了格外优化。l Linux 内核:Android整个操作系统基于Linux内核,内核提供显示、照相、闪存、软键盘、Wi-Fi、音频等驱动程序,提供对进程间通信机制Binder的驱动,提供电源管理服务。2.3 Android平台本地应用的开发同PC上应用的部署模式一样,Android应用也可有纯本地应用,C/S模式和B/S模式。此外,C/S和B/S相结合的模式本地应用利用W
24、eb控件显示Web页面,或Web应用利用Javascript调用本地程序也十分常见。此外,具有数据同步功能的本地应用模式,在联系人、日历、电子邮件等核心应用中都有体现。2.3.1 虚拟机之上的Java应用Android应用(至少是目前)是使用Java语言开发的。Java代码被编译成字节码,再被编译成.dex可执行文件,以在Dalvik虚拟机上高效运行。Android应用由四大组件构成Activity, Service, Content Provider, 和Broadcast receiver。每个组件以类的形式存在。类应该具有高度的内聚性;类与类之间应该具有极低的耦合性。Activity负责
25、呈现用户界面并与用户交互;Service运行在后台,负责处理耗时操作,或是为服务远程进程;Content Provider负责管理可被共享的应用程序数据;Broadcast receiver则能响应系统级的广播消息。Android系统设置独有的特点是,任何应用都能启用其他应用的组件,显式或隐式地。一个Activity可以调用另一个Activity或Service;Service可在Activity结束之后关闭,或继续运行。当系统启用某一应用的某一组件,该应用的进程就被启动(如果不是已经启动了的话),该组件所需的类就被初始化。不同于其他的系统,Android应用程序没有唯一的入口(比如就没有ma
26、in()函数)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+或汇编
27、写成的、依赖硬件和操作系统平台的程序或库。它定义了可管理代码(用Java语言写成)与本地代码交互的方法。它厂商中立,支持从动态链接库载入代码;虽然繁琐,但常能获得可观的效率7。2)JNA(Java Native Access)JNA,Java本地访问,是SUN公司主导研发的,建立在经典的JNI的基础之上的一个开源框架。它是也另一个访问本地代码的方法,大有取代JNI的趋势。JNA的设计就是为了提供一种自然的方式、以最少的工作量实现对本地代码的访问。它不需要像JNI中那样的样板文件或生成的粘合代码9。JNA堪比Window的P/Invoke和Python的ctype。但是,Android官方并没有
28、集成JNA。据Android开源项目参与者fadden回答:第一是因为性能不如JNI,在对性能要求高的应用中人们更倾向于使用JNI;第二是因为使用Java和公开的API来实现应用更有利用应用程序自身和Android的发展;第三是JNA遵循的是LGPL许可,将它放入Android官方发行会带来许可问题。尽管如此,Android官方仍然会考虑在虚拟机中提供挂钩,允许开发者将JNA库作为应用程序安装包的一部分,自行使用10。JNA源代码可从GitHub获得11。3)JavaCPPJavaCPP提供了在Java中高效访问C+的方法,与某些C/C+编译器与汇编语言交互的方式颇为类似。在其底层,同样采用的
29、是JNI,因此所有的Java实现它都支持,包括Android。与其他访问本地代码的途径(包括SWIG,CableSwig,JNIGeneratorApp,JNIWrapper,Platform Invoke,GlueGen,JNIDirect,JNA,JniMarshall,JNative,J/Invoke,HawtJNI,BridJ等等)所明显不同的是,它高效而自然地支持C+语言许多经常被认为有弊病的特性,包括操作符重载、模板类和模板函数、成员函数指针、回调函数、嵌套结构体定义、可变长参数、嵌套命名空间、包含任意循环的大数据结构、多继承、按值/引用/微量传递、匿名结构体、位域、异常、析构以及
30、垃圾回收。JavaCPP项目的作者samuel已经通过JavaCPP,为OpenCV,FFmpeg,libdc1394,PGR FlyCapture,OpenKinect,videoInput,和ARToolKitPlus等图像库生成了完整的接口,集成到了他的开源项目JavaCV当中18。JavaCPP底层实现最开始使用的是JNA,后来又回到了JNI10。2.4 Android平台数据的存储与同步2.4.1 嵌入式关系数据库管理系统SQLiteSQLite是一个包含一个自包含、无服务、零配制、事务型的SQL数据库引擎的软件库。它是世界上最流行的数据库引擎之一。并且,SQLite的源代码已经进入
31、了公共域,可自由使用11。Android提供了对SQLite数据库的完全支持。你所创建的任何数据库都能被当前应用中的任何类按名访问,当前应用之外的类则不行12。2.4.1.1 SQLite 3中的数据类型14大部分数据库引擎(就我们所知,除SQLite之外的任何其他数据库引擎)使用着传统的静态类型。静态类型下,一个值的数据类型由其容器该值所存储在的列所决定。SQLite使用一种更加泛化的动态类型系统。在SQLite中,一个值的数据类型依赖于其值本身而非其容器。在其他静态类型数据库上能使用的SQL语言,在SQLite上同样能使用;在这一意义上讲,SQLite的这一动态类型系统相对其他数据库的静态
32、类型系统具有向后兼容的能力。而且,SQLite中的动态类型能让它完成传统类型数据库所不能完成的工作。最后,值得注意的是,SQLite对特殊的一列ROWID的处理。它与在Android中对SQLite的访问密切相关。2.4.1.2 ROWID和整型主码SQLite表的每一行都有一个64位有符号整数键,唯一地标识表中该一行。该整数通常被称作“rowid”。rowid的值可使用以下任意列名的任意大小写形式访问:“rowid”“oid”或“_rowid_”。如果一个表已经存在了一个用户定义的名叫“rowid”“oid”或“_rowid_”的列,则使用这些名字时,访问的是用户定义的列;这一整型rowid
33、行将不再能被检索到15。SQLite的每一张表都以一棵B树的数据结构存储。该树包含了对每一行的一个入口,入口地址是一个整型主码(INTEGER PRIMARY KEY),或rowid。这意味着按rowid检索或排序记录速度极快。搜索某一指定或在某一范围内的rowid的行,比相同情况下在其他主码或索引上搜索,要快一倍15。也正是这个原因,Android中重要的UI组件ListView访问SQLite数据库所使用的适配器CursorAdapter对查询结果Cursor的列有一个特殊的要求:必须要有一个名叫“_id”的列16。在实现上,ListView的一行(即一个ListItem)对应Cursor
34、的一行;据观察,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:/获取弹出菜单的菜单信
35、息;该菜单信息包含了适配器上下文信息,其中就包含了适配器为当前列表项绑定的(Cursor的)idAdapterContextMenuInfo info=(AdapterContextMenuInfo) item.getMenuInfo();/当前列表项的idint id=info.id;此外,要获取当前列表项中子View的值,也有快捷的方法:/当前列表项在适配器上的位置int position=info.position;/获取适配器为当前列表项绑定的Cursor(或一行记录)Cursor cursor = (Cursor) getListAdapter().getItem(position)
36、;/反过来获取Cursor中的列“_id”的值,与info.id对比String _id = cursor.getString(cursor.getColumnIndex(_id);Log.v(TAG, _id at position + position + , id + id + is + _id);对比会发现,无论对列表项进行新增、删除、排序等任何操作,id与_id均相同;相反,position表示的只是当前列表项在列表ListView中的下标,与id或_id没有直接的关系。以上问题是困扰作者本人在内的许多开发者许久的问题。通过一定的分析和实验,结果是可知的。这或许也是做开发的乐趣之所在
37、。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)连接
38、,不再需要中间互连点(如无线路由器或Wi-Fi热点)。使用Android所提供的API,你可以发现并连接到同样支持Wi-Fi直接的设备上,然后与之进行比蓝牙距离更远的高速通信。基于该技术,我们构想出了两种多终端通信方式:1)C/S单向同步。2)对等双向同步。鉴于实验条件不允许,我们仅对逻辑的实现作理论的分析。相信经过这一分析,在Android API 14实现起来是不难的。(1)C/S单向同步在该同步方式中,指定一台设备作为服务器,或才最先启动同步服务的设备自动作为服务器;其他设备作为客户机;首先轮流上传各自的数据,服务器负责数据的新增、更新与合并;然后轮流从服务器下载最新的数据。作为服务器的
39、设备(服务设备)首先启动同步服务,其他设备(请求设备)搜寻到该设备,发送同步请求。服务设备在用户的协助的对请求设备进行身份认证,并允许保存身份信息(即配对)以供下次免认证连接。服务设备上启用一个服务,或为每个设备启用一个服务,响应所有设备发送过来的通知(包含对数据变更的描述和数据本身)。响应操作包括:备份同步前的数据;新增设备新增的记录,缓存设备的修改和删除请求并在最后提示用户确认(修改或删除),最后标记版本。全部设备的变更上传完成后,服务设备转而向所有请求设备发送指令,备份并删除其同步前数据,并下载同步后的数据。(2)对等双向同步在该同步方式中,设备间对等通信,向其他配对设备播送自身数据的变
40、化,同时接收与处理其他配对设备数据变化的通知。该方式与C/S单向同步的不同之处在于,设备同时扮演两种角色:服务设备和请求设备;无需下载同步后数据。两种同步方式都希望所有设备在当时当地可用,否则每一部设备上的数据都不是严格意义上“最新”的数据。但在实际应用中,对“最新”的要求并不高;相反,每周一次的同步(比如在例会与工作总结时同步工作数据),在同步时展示与统计每一部终端的数据变更,反而有得于对工作的评价。3 需求分析从本章开始,我们将回到绪论中所描述的问题,应用前面两章所提供的技术手段,分析、设计并实现一个基于Android平台的车辆信息查询系统。需求分析是系统设计与实现的前提,也是软件开发生命
41、周期中最重要的一步。在面向对象的需求分析方法中,UML模型图起到了十分关键的作用。本章通过用例图来提取与静态地描述需求,通过交互图来动态地描述需求,以供总体设计中类与实体的提取、类图和实体关系图的生成。3.1 功能需求我们将通过建立用例图来逐步描述、抽象、细化功能需求。3.1.1 OpenCVOpenCV(开源计算机视觉)是一个用于实时计算机视觉的程序函数库。它在BSD许可下发布,学术和商业上均可免费使用。它拥有能运行在Windows、Linux、Android以及Mac上的C+、C、Pythoon和Java的接口。该库拥有超过2500个算法的优化。使用者遍布全球,拥有2,500,000以上的
42、下载量和40,000用户组成员。使用范围从交互艺术到矿物探测,再到Web图形检索等领域20。OpenCV由英特尔公司于1999年起开发,用C/C+写成,包含了500多个函数。OpenCV的构成如图2。CXCORE基本结构和算法,XML支持,绘图函数CV图像处理和视觉算法HighGUIGUI,图像和视频 I/O图2 OpenCV的构成3.1.2 JavaCVJavaCV是一个OpenCV的Java接口。它为计算机视觉领域调查者们常用的库提供了封装。这些库包括:OpenCV,FFmpeg,libdc1394,PGR FlyCapture,OpenKinect,videoInput,和ARToolK
43、itPlus等。com.googlecode.javacv.cpp包命名空间下的类便展示出了完整的API。并且,实用类还使自身的功能在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文件夹中,即完成了对JavaC
44、V库引用。项目目录结构如图3。具体请参照项目主页的介绍。图3 AndroidVIQ项目目录结构3.2 车牌探测在图像处理技术中,Haar特征提取技术常用于从图像中提取物体22。该技术涉及神经网络等算法,限于知识水平,暂不研究。边缘检测作为一种简单的物体检测方法,特别适合于矩形外框的车牌。本课题采用基于边缘检测的车牌探测技术。原始车辆图像如图4。图4 原始车辆图像3.2.1 将原始图像转化为灰阶图像cvCvtColor(mVehicleImage, vehicleImageGray, CV_BGR2GRAY);图5 灰阶图像3.2.2 灰阶图像的平滑与增强处理cvSmooth(vehicleIm
45、ageGray, vehicleImageGray, CV_GAUSSIAN, 3);cvEqualizeHist(vehicleImageGray, vehicleImageGray);图6 平滑与增强过后的灰阶图像3.2.3 灰阶图像转化为二值图像cvThreshold(vehicleImageGray, vehicleImageBinary, 128, 255, CV_THRESH_BINARY);图7 二值图像3.2.4 从二值图像中提取轮廓CvSeq contours = new CvSeq();int objects = cvFindContours(vehicleImageBin
46、ary, cvCreateMemStorage(0), contours, Loader.sizeof(CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);图8 轮廓图像(黑色背景上的白色轮廓线,不易观察)3.2.5 基于边缘检测的车牌探测经检测,提取的图像轮廓中有约1800个独立轮廓区域。我们这样来找到车牌轮廓区域:用指定精度逼近曲线轮廓,形成一个多边形轮廓;如果多边形为四边形,面积足够大,且宽高比介于2.8到3.4之间(普通车牌外廓尺寸为440mm140mm,宽高比为3.14),则可初步判断它为车牌轮廓,接下来的工作将围绕该区域展
47、开。示例代码如下:/获得多边形轮廓CvSeq polyContours = cvApproxPoly(contours, Loader.sizeof(CvContour.class), cvCreateMemStorage(0), CV_POLY_APPROX_DP, cvContourPerimeter(contours) * 0.05, 0);/检查轮廓边数和面积 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);/接下来:进行车