




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、目 錄目 錄8摘 要10abstract111緒論121.1問(wèn)題描述與項(xiàng)目動(dòng)因121.2篇章結(jié)構(gòu)132android移動(dòng)操作系統(tǒng)142.1移動(dòng)計(jì)算142.2android技術(shù)背景142.2.1android的特性142.2.2android架構(gòu)152.3android平臺(tái)本地應(yīng)用的開(kāi)發(fā)162.3.1虛擬機(jī)之上的java應(yīng)用162.3.2linux之上的c/c+本地代碼162.4android平臺(tái)數(shù)據(jù)的存儲(chǔ)與同步172.4.1嵌入式關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)sqlite172.4.2android平臺(tái)的數(shù)據(jù)同步193需求分析203.1圖像處理203.1.1opencv203.1.2javacv203.2
2、車(chē)牌探測(cè)213.2.1將原始圖像轉(zhuǎn)化為灰階圖像223.2.2灰階圖像的平滑與增強(qiáng)處理223.2.3灰階圖像轉(zhuǎn)化為二值圖像223.2.4從二值圖像中提取輪廓233.2.5基于邊緣檢測(cè)的車(chē)牌探測(cè)233.3車(chē)牌字符分割243.4車(chē)牌字符識(shí)別253.4.1tesseract ocr引擎253.4.2車(chē)牌語(yǔ)言的訓(xùn)練253.4.3tesseract庫(kù)在android中的使用274需求分析與設(shè)計(jì)294.1功能需求294.1.1用例模型294.1.2交互圖324.2非功能需求345系統(tǒng)設(shè)計(jì)、實(shí)現(xiàn)與測(cè)試365.1系統(tǒng)的設(shè)計(jì)365.1.1程序邏輯設(shè)計(jì)365.1.2數(shù)據(jù)庫(kù)設(shè)計(jì)385.2系統(tǒng)實(shí)現(xiàn)385.2.1支撐條件
3、395.2.2類(lèi)的實(shí)現(xiàn)415.2.3數(shù)據(jù)庫(kù)模式425.3運(yùn)行與測(cè)試435.3.1運(yùn)行演示435.3.2測(cè)試466結(jié)語(yǔ)與后續(xù)計(jì)劃48參考文獻(xiàn)49致 謝52摘 要本文基于android移動(dòng)操作系統(tǒng),集成了dom4j、sqlite等幾大開(kāi)源技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于android平臺(tái)的火車(chē)票在線查詢(xún)系統(tǒng)。軟件可下載到手機(jī)上,實(shí)現(xiàn)了在任何地方都能查詢(xún)火車(chē)時(shí)刻表信息。該軟件是適應(yīng)時(shí)代發(fā)展的需求,方便人們的日常出行,提升工作效率而開(kāi)發(fā)設(shè)計(jì)的,所開(kāi)發(fā)的系統(tǒng)功能都包括按照發(fā)車(chē)站和到達(dá)站進(jìn)行查詢(xún),按照車(chē)次進(jìn)行查詢(xún),點(diǎn)對(duì)點(diǎn)天氣查詢(xún)以及周邊售票查詢(xún)。論文主要學(xué)習(xí)、研究基于android平臺(tái)的火車(chē)時(shí)刻表信息查詢(xún)系統(tǒng)的
4、技術(shù)實(shí)現(xiàn),具體內(nèi)容包括:android技術(shù)背景,android平臺(tái)本地應(yīng)用的開(kāi)發(fā),android平臺(tái)數(shù)據(jù)的存儲(chǔ)與同步,android平臺(tái)上地圖定位以及android平臺(tái)獲取網(wǎng)絡(luò)xml解析技術(shù)的實(shí)現(xiàn)。通過(guò)本對(duì)課題的研究、調(diào)查與實(shí)現(xiàn),歸納出了android系統(tǒng)在火車(chē)時(shí)刻表方面的典型應(yīng)用場(chǎng)景和用例;介紹了與之相關(guān)的理論和技術(shù)基礎(chǔ);詳細(xì)講解了這些理論和技術(shù)基礎(chǔ)在本系統(tǒng)中的實(shí)踐與運(yùn)用;圍繞解析網(wǎng)絡(luò)信息課程,研究了在android系統(tǒng)上如何將解析到的xml數(shù)據(jù)抽絲剝繭地顯示在布局上以及android上內(nèi)置的sqlite嵌入式數(shù)據(jù)庫(kù)技術(shù);圍繞軟件更新、數(shù)據(jù)統(tǒng)計(jì)和意見(jiàn)反饋,研究了如如何利用友盟手機(jī)平臺(tái)實(shí)現(xiàn)軟件
5、的管理推廣和盈利方式。本文的特色在于:1)將基于android火車(chē)信息查詢(xún)成功實(shí)現(xiàn);2)集成創(chuàng)新,百度地圖等技術(shù),源碼易于獲得且允許商業(yè)應(yīng)用;3)本課題亦以開(kāi)源項(xiàng)目的形式開(kāi)展。關(guān)鍵詞:android;火車(chē)票信息查詢(xún); 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 緒論隨著國(guó)民經(jīng)濟(jì)的發(fā)展,信息時(shí)代已經(jīng)來(lái)臨。手機(jī)應(yīng)用用于火車(chē)時(shí)刻信息查詢(xún)?yōu)椴樵?xún)類(lèi)應(yīng)用帶來(lái)了從未有過(guò)的動(dòng)力和機(jī)遇,為火
12、車(chē)時(shí)刻管理領(lǐng)域的飛速發(fā)展提供了無(wú)限的潛力。采用手機(jī)終端查詢(xún)火車(chē)時(shí)刻信息已經(jīng)代替了以往用計(jì)算機(jī)網(wǎng)頁(yè)查詢(xún)已成為科技化和現(xiàn)代化的重要標(biāo)志,給人們的出行帶來(lái)了明顯的經(jīng)濟(jì)效益和社會(huì)效益。這類(lèi)應(yīng)用普遍存在場(chǎng)地不固定、需求變化快等特點(diǎn),傳統(tǒng)基于臺(tái)式計(jì)算機(jī)的火車(chē)時(shí)刻表查詢(xún)系統(tǒng)很難適應(yīng)。即使努力適應(yīng),建設(shè)傳統(tǒng)車(chē)輛管理系統(tǒng),需要有專(zhuān)用的攝像裝置;車(chē)輛的行駛路徑和停放位置須服從攝像裝置的要求;需要設(shè)置護(hù)欄,卻又容易導(dǎo)致車(chē)輛停放困難。這此無(wú)疑增加了車(chē)輛信息管理的成本,制約了車(chē)輛信息數(shù)字化的進(jìn)程。移動(dòng)智能終端的普及,讓移動(dòng)計(jì)算正取代傳統(tǒng)桌面計(jì)算成為越來(lái)越重要的信息處理方式。android移動(dòng)操作系統(tǒng)在移動(dòng)計(jì)算平臺(tái)中處于
13、領(lǐng)先的地位。配備打電話、gps和網(wǎng)絡(luò)功能的android終端尤其是android手機(jī),完全能在火車(chē)時(shí)刻表查詢(xún)系統(tǒng)中扮演重要的角色,其中最重要的是車(chē)站信息的查詢(xún)、車(chē)次信息查詢(xún),其次重要的是天氣信息查詢(xún)。android終端在扮演這一角色的過(guò)程中,有兩大問(wèn)題需要解決:一、有限的計(jì)算能力,如何快速準(zhǔn)確地獲取網(wǎng)絡(luò)火車(chē)時(shí)刻表數(shù)據(jù),以的將信息解析獲取最終以簡(jiǎn)潔的格式顯示在手機(jī)上;二、收藏功能數(shù)據(jù)庫(kù)的實(shí)現(xiàn),在網(wǎng)絡(luò)不可靠的情況下,如何獲取與存儲(chǔ)數(shù)據(jù)。關(guān)于android平臺(tái)上的車(chē)牌識(shí)別,在本系統(tǒng)中,我們通過(guò)使用javacpp和jni技術(shù)實(shí)現(xiàn)了對(duì)opencv和 tesseract ocr本地代碼庫(kù)的調(diào)用;為了準(zhǔn)確識(shí)
14、別出車(chē)牌號(hào)碼,我們通過(guò)tesseract訓(xùn)練出了中華人民共和國(guó)機(jī)動(dòng)車(chē)號(hào)牌1的語(yǔ)言包。關(guān)于android平臺(tái)上數(shù)據(jù)的存儲(chǔ)與同步,在本系統(tǒng)中,我們采用了android內(nèi)建的sqlite技術(shù)進(jìn)行數(shù)據(jù)的結(jié)構(gòu)化存儲(chǔ)與訪問(wèn);特別針對(duì)android 4.0及以上版本,討論了端對(duì)端wi-fi直連通訊技術(shù)的實(shí)現(xiàn)。1.1 問(wèn)題描述與項(xiàng)目動(dòng)因火車(chē)時(shí)刻查詢(xún),包括站點(diǎn)之間的查詢(xún)、車(chē)次的查詢(xún)、城市天氣的查詢(xún)以及用戶(hù)周邊火車(chē)票代售處的查詢(xún)。這些信息在實(shí)際典型場(chǎng)景中的應(yīng)用,舉例如下:1)火車(chē)站點(diǎn)查詢(xún)管理目前,隨著現(xiàn)在社會(huì)的發(fā)展,我們的生活也朝著電子化不斷發(fā)展,如出行需用火車(chē)的頻率也越來(lái)越普及,經(jīng)濟(jì)的不斷發(fā)展避免不了人們要到一
15、些不熟悉的城市出差或者旅行,但是當(dāng)你對(duì)于該怎么去而不知所措的時(shí)候,那出門(mén)就會(huì)變得舉步維艱,無(wú)所適從。用電腦上網(wǎng)查詢(xún),對(duì)于一些比較發(fā)達(dá)的城市也許不算什么,但是對(duì)于一些偏遠(yuǎn)的地區(qū),周邊沒(méi)有提供電腦上網(wǎng)的條件或者場(chǎng)所,那就會(huì)有不必要的麻煩。此時(shí)若手機(jī)中安裝有本火車(chē)時(shí)刻表查詢(xún)系統(tǒng)的軟件此麻煩迎刃而解,用戶(hù)只需打開(kāi)手機(jī)的網(wǎng)絡(luò)就能隨時(shí)隨地的查詢(xún)到與自己出行相關(guān)的火車(chē)時(shí)刻信息,而不用顧及自己身在何地是否有計(jì)算機(jī)。幫助出行人士方便、高效的安排自己的行程。2)天氣的預(yù)報(bào)當(dāng)今社會(huì)的國(guó)民經(jīng)濟(jì)之所以能夠持續(xù)、快速、健康的發(fā)展和經(jīng)濟(jì)建設(shè)、人民生活、天氣預(yù)報(bào)都有著密切的聯(lián)系。天氣預(yù)報(bào)的技術(shù)水平隨之增加,在防災(zāi)減災(zāi)和國(guó)民經(jīng)
16、濟(jì)建設(shè)中發(fā)揮了巨大作用。在火車(chē)時(shí)刻查詢(xún)中增加天氣預(yù)報(bào)的功能不僅給人們帶來(lái)了很大的幫助,而且為社會(huì)也做了件有意義的事情。對(duì)于人們來(lái)說(shuō),坐火車(chē)出行無(wú)非就是旅行或者是探親,選擇一個(gè)適合自己的天氣出行不僅對(duì)自己的安全有所保障還對(duì)社會(huì)公共安全減少一點(diǎn)壓力。對(duì)于社會(huì)來(lái)說(shuō),保證人們的出行安全是社會(huì)的責(zé)任。如果大雪大雨的天氣還是有很多的乘客,一些糾紛一些人與人之間的事故難免會(huì)發(fā)生。有了天氣預(yù)報(bào)功能,人們?cè)陬A(yù)定火車(chē)票的時(shí)候可以選擇避開(kāi)不好的天氣,就會(huì)減少大量的乘客,這樣也為社會(huì)的治安工作提供了很大的幫助。在手機(jī)火車(chē)信息查詢(xún)中加入天氣預(yù)報(bào)功能方便了乘客的查詢(xún)需求,也避免了一些乘客忘記天氣變換對(duì)出行的影響。3)地圖
17、定位服務(wù)擁有地圖的定位功能是很多軟件的重要業(yè)務(wù)內(nèi)容。使用本系統(tǒng)的提供的百度地圖定位服務(wù),用戶(hù)能能夠準(zhǔn)確的了解到自身所在的城市位置,方便用戶(hù)使用站點(diǎn)查詢(xún)火車(chē)時(shí)刻表信息。該服務(wù)還能為用戶(hù)提供周邊五千米內(nèi)的火車(chē)票代售處,方便用戶(hù)在不熟悉的城市或者地區(qū)快速的買(mǎi)到車(chē)票,從而更加高效的利用時(shí)間上述應(yīng)用場(chǎng)景要求移動(dòng)智能設(shè)備有網(wǎng)絡(luò)數(shù)據(jù)查詢(xún)、地圖定位、自動(dòng)記錄時(shí)間和地點(diǎn)、快速天氣信息、保存車(chē)次信息等功能。此外,數(shù)據(jù)備份、電話訂購(gòu)火車(chē)票、與友盟平臺(tái)的軟件更新和意見(jiàn)反饋,也是隱含的功能需求。本項(xiàng)目即致力于設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基于android平臺(tái)的火車(chē)票信息查詢(xún)系統(tǒng),以滿(mǎn)足上述應(yīng)用場(chǎng)景的需求。1.2 篇章結(jié)構(gòu)本論文正文部
18、分圍繞以下結(jié)構(gòu)展開(kāi):第二章介紹android移動(dòng)操作系統(tǒng),重點(diǎn)介紹了android平臺(tái)本地應(yīng)用的開(kāi)發(fā)和數(shù)據(jù)的存儲(chǔ)與解析技術(shù)。第三章介紹解析網(wǎng)絡(luò)數(shù)據(jù)的理論、技術(shù)以及在android平臺(tái)上的實(shí)現(xiàn)。它是本項(xiàng)目的創(chuàng)新點(diǎn)和核心工作之一。第四章介紹系統(tǒng)需求的分析與設(shè)計(jì)。第五章介紹系統(tǒng)的設(shè)計(jì)、實(shí)現(xiàn)與測(cè)試。第六章總結(jié)全文,并對(duì)接下來(lái)的工作提出展望與規(guī)劃。2 android移動(dòng)操作系統(tǒng)2.1 移動(dòng)計(jì)算移動(dòng)計(jì)算是隨著移動(dòng)通信、互聯(lián)網(wǎng)、數(shù)據(jù)庫(kù)、分布式計(jì)算等技術(shù)的發(fā)展而興起的新技術(shù)。移動(dòng)計(jì)算技術(shù)將使計(jì)算機(jī)或其它信息智能終端設(shè)備在無(wú)線環(huán)境下實(shí)現(xiàn)數(shù)據(jù)傳輸及資源共享。它的作用是將有用、準(zhǔn)確、及時(shí)的信息提供給任何時(shí)間、任何地
19、點(diǎn)的任何人。這將極大地改變?nèi)藗兊纳罘绞胶凸ぷ鞣绞?。手持移動(dòng)設(shè)備,或手機(jī),特別是智能手機(jī),將是由傳統(tǒng)桌面計(jì)算向移動(dòng)計(jì)算或云計(jì)算這一轉(zhuǎn)變過(guò)程中的主力軍。隨時(shí)隨地可用,傳感器豐富等相對(duì)傳統(tǒng)桌面計(jì)算機(jī)的突出優(yōu)點(diǎn),為智能手機(jī)改變?nèi)藗兊墓ぷ髋c生活提供了各種可能。智能手機(jī)將逐步發(fā)展成人們眼、耳、腦以及不存在感官的延伸,幫助人們獲取、處理、存儲(chǔ)與呈現(xiàn)信息,幫助人們作出決定,展現(xiàn)給人們美好的事物,引領(lǐng)人們更加智慧與舒適地生活。移動(dòng)平臺(tái)是目前和將來(lái)相當(dāng)一段時(shí)間應(yīng)用部署的重要平臺(tái)。2012年年初,蘋(píng)果應(yīng)用商店已經(jīng)擁有了超過(guò)53萬(wàn)款應(yīng)用,而google play所能提供的應(yīng)用數(shù)目也已突破了40萬(wàn)大關(guān),涵蓋了游戲、
20、效率、社交、購(gòu)物、交通、體育、圖書(shū)與工具書(shū)等等領(lǐng)域,滲入了生活的方方面面。下載量上,僅以android以例。最高下載量已達(dá)5億(谷歌地圖),相當(dāng)多的免費(fèi)應(yīng)用的下載量在十萬(wàn)級(jí)別以上,收費(fèi)應(yīng)用也在萬(wàn)級(jí)別以上(具體請(qǐng)參照google play)。一款受歡迎的應(yīng)用的市場(chǎng)價(jià)值十分巨大,而且這一市場(chǎng)才剛剛起步。2.2 android技術(shù)背景android是用于移動(dòng)設(shè)備上的一個(gè)包含一操作系統(tǒng),一系列中間件,以及部分關(guān)鍵應(yīng)用軟件棧。android sdk網(wǎng)站提供了在android平臺(tái)上使用java編程語(yǔ)言開(kāi)發(fā)應(yīng)用程序所必須的工具和api4。2.2.1 android的特性l 應(yīng)用框架,實(shí)現(xiàn)了組合的重用與替換l
21、 dalvik虛擬機(jī),專(zhuān)為移動(dòng)設(shè)備優(yōu)化l 集成的瀏覽器,基于開(kāi)源的webkit引擎l 優(yōu)化的圖形,由一個(gè)定制的2d圖形庫(kù)驅(qū)動(dòng),3d圖形基于opengl es 1.0規(guī)范(硬件加速可選)l 媒體支持,支持常用音頻、視頻以及圖像格式(mpeg4, h.264, mp3, aac, amr, jpg, png, gif)l gsm通話(依賴(lài)硬件)l 藍(lán)牙,edge(增強(qiáng)型數(shù)據(jù)速率gsm演進(jìn)技術(shù)),3g,以及wi-fi(依賴(lài)硬件)l 相機(jī),gps,指南針,加速計(jì)(依賴(lài)硬件)l 豐富的開(kāi)發(fā)環(huán)境,包括一個(gè)設(shè)備模擬器,測(cè)試工具,內(nèi)存和性能分析,以及用于eclipse ide的一個(gè)插件2.2.2 androi
22、d架構(gòu)圖1 android架構(gòu)圖android架構(gòu)由上至下分四層,如圖1。描述如下:l 應(yīng)用層:包括由系統(tǒng)默認(rèn)提供了桌面、聯(lián)系人、通話、瀏覽器等基礎(chǔ)應(yīng)用,以及由廣大開(kāi)發(fā)人員開(kāi)發(fā)、可下載安裝的拓展應(yīng)用。拓展應(yīng)用訪問(wèn)下層應(yīng)用框架層方面,和由廠商提供的基礎(chǔ)應(yīng)用一樣,沒(méi)有任何尊卑之別。l 應(yīng)用框架層:應(yīng)用開(kāi)發(fā)基本的api,提供包管理、通話管理、資源管理、位置管理、通知管理、activity管理,窗口管理、內(nèi)容提供設(shè)施、視力系統(tǒng)。l 庫(kù):用c/c+寫(xiě)成。提供sgl底層2d繪圖引擎,安全套接層,嵌入式標(biāo)準(zhǔn)c庫(kù),opengl 3d繪圖,freetype字體,瀏覽器核心,用戶(hù)空間顯示管理,媒體框架,以及輕量級(jí)
23、sqlite關(guān)系型數(shù)據(jù)庫(kù)。l 運(yùn)行環(huán)境:與jre極其相似。核心包包含了在java開(kāi)發(fā)中常用的類(lèi)庫(kù)如io、utility等;dalvik虛擬機(jī)類(lèi)似jvm,同樣也是專(zhuān)為android定制,針對(duì)手持設(shè)備,在存儲(chǔ)、計(jì)算以及功耗等方面作了格外優(yōu)化。l linux 內(nèi)核:android整個(gè)操作系統(tǒng)基于linux內(nèi)核,內(nèi)核提供顯示、照相、閃存、軟鍵盤(pán)、wi-fi、音頻等驅(qū)動(dòng)程序,提供對(duì)進(jìn)程間通信機(jī)制binder的驅(qū)動(dòng),提供電源管理服務(wù)。2.3 android平臺(tái)本地應(yīng)用的開(kāi)發(fā)同pc上應(yīng)用的部署模式一樣,android應(yīng)用也可有純本地應(yīng)用,c/s模式和b/s模式。此外,c/s和b/s相結(jié)合的模式本地應(yīng)用利用w
24、eb控件顯示web頁(yè)面,或web應(yīng)用利用javascript調(diào)用本地程序也十分常見(jiàn)。此外,具有數(shù)據(jù)同步功能的本地應(yīng)用模式,在聯(lián)系人、日歷、電子郵件等核心應(yīng)用中都有體現(xiàn)。2.3.1 虛擬機(jī)之上的java應(yīng)用android應(yīng)用(至少是目前)是使用java語(yǔ)言開(kāi)發(fā)的。java代碼被編譯成字節(jié)碼,再被編譯成.dex可執(zhí)行文件,以在dalvik虛擬機(jī)上高效運(yùn)行。android應(yīng)用由四大組件構(gòu)成activity, service, content provider, 和broadcast receiver。每個(gè)組件以類(lèi)的形式存在。類(lèi)應(yīng)該具有高度的內(nèi)聚性;類(lèi)與類(lèi)之間應(yīng)該具有極低的耦合性。activity負(fù)責(zé)
25、呈現(xiàn)用戶(hù)界面并與用戶(hù)交互;service運(yùn)行在后臺(tái),負(fù)責(zé)處理耗時(shí)操作,或是為服務(wù)遠(yuǎn)程進(jìn)程;content provider負(fù)責(zé)管理可被共享的應(yīng)用程序數(shù)據(jù);broadcast receiver則能響應(yīng)系統(tǒng)級(jí)的廣播消息。android系統(tǒng)設(shè)置獨(dú)有的特點(diǎn)是,任何應(yīng)用都能啟用其他應(yīng)用的組件,顯式或隱式地。一個(gè)activity可以調(diào)用另一個(gè)activity或service;service可在activity結(jié)束之后關(guān)閉,或繼續(xù)運(yùn)行。當(dāng)系統(tǒng)啟用某一應(yīng)用的某一組件,該應(yīng)用的進(jìn)程就被啟動(dòng)(如果不是已經(jīng)啟動(dòng)了的話),該組件所需的類(lèi)就被初始化。不同于其他的系統(tǒng),android應(yīng)用程序沒(méi)有唯一的入口(比如就沒(méi)有ma
26、in()函數(shù))6。2.3.2 linux之上的c/c+本地代碼android應(yīng)用由java所寫(xiě),運(yùn)行在虛擬機(jī)上,在處理大量數(shù)值、矩陣運(yùn)算時(shí),效率比較低。c、c+則直接運(yùn)行于硬件之上,能充分發(fā)揮硬件的性能。此外,大量傳統(tǒng)與廣泛使用的底層庫(kù)文件(包括圖形圖像處理、數(shù)據(jù)庫(kù)管理系統(tǒng)等)都是由c/c+寫(xiě)成,它們向android平臺(tái)的遷移應(yīng)以怎樣的方式進(jìn)行呢?下面介紹三種方式:jni,jna和javacpp。1)jni(java native interface)jni,java本地接口,是一個(gè)允許運(yùn)行在java虛擬機(jī)上的java代碼調(diào)用本地代碼或被本地代碼調(diào)用的應(yīng)用編程框架。本地代碼即指用c/c+或匯編
27、寫(xiě)成的、依賴(lài)硬件和操作系統(tǒng)平臺(tái)的程序或庫(kù)。它定義了可管理代碼(用java語(yǔ)言寫(xiě)成)與本地代碼交互的方法。它廠商中立,支持從動(dòng)態(tài)鏈接庫(kù)載入代碼;雖然繁瑣,但常能獲得可觀的效率7。2)jna(java native access)jna,java本地訪問(wèn),是sun公司主導(dǎo)研發(fā)的,建立在經(jīng)典的jni的基礎(chǔ)之上的一個(gè)開(kāi)源框架。它是也另一個(gè)訪問(wèn)本地代碼的方法,大有取代jni的趨勢(shì)。jna的設(shè)計(jì)就是為了提供一種自然的方式、以最少的工作量實(shí)現(xiàn)對(duì)本地代碼的訪問(wèn)。它不需要像jni中那樣的樣板文件或生成的粘合代碼9。jna堪比window的p/invoke和python的ctype。但是,android官方并沒(méi)有
28、集成jna。據(jù)android開(kāi)源項(xiàng)目參與者fadden回答:第一是因?yàn)樾阅懿蝗鏹ni,在對(duì)性能要求高的應(yīng)用中人們更傾向于使用jni;第二是因?yàn)槭褂胘ava和公開(kāi)的api來(lái)實(shí)現(xiàn)應(yīng)用更有利用應(yīng)用程序自身和android的發(fā)展;第三是jna遵循的是lgpl許可,將它放入android官方發(fā)行會(huì)帶來(lái)許可問(wèn)題。盡管如此,android官方仍然會(huì)考慮在虛擬機(jī)中提供掛鉤,允許開(kāi)發(fā)者將jna庫(kù)作為應(yīng)用程序安裝包的一部分,自行使用10。jna源代碼可從github獲得11。3)javacppjavacpp提供了在java中高效訪問(wèn)c+的方法,與某些c/c+編譯器與匯編語(yǔ)言交互的方式頗為類(lèi)似。在其底層,同樣采用的
29、是jni,因此所有的java實(shí)現(xiàn)它都支持,包括android。與其他訪問(wèn)本地代碼的途徑(包括swig,cableswig,jnigeneratorapp,jniwrapper,platform invoke,gluegen,jnidirect,jna,jnimarshall,jnative,j/invoke,hawtjni,bridj等等)所明顯不同的是,它高效而自然地支持c+語(yǔ)言許多經(jīng)常被認(rèn)為有弊病的特性,包括操作符重載、模板類(lèi)和模板函數(shù)、成員函數(shù)指針、回調(diào)函數(shù)、嵌套結(jié)構(gòu)體定義、可變長(zhǎng)參數(shù)、嵌套命名空間、包含任意循環(huán)的大數(shù)據(jù)結(jié)構(gòu)、多繼承、按值/引用/微量傳遞、匿名結(jié)構(gòu)體、位域、異常、析構(gòu)以及
30、垃圾回收。javacpp項(xiàng)目的作者samuel已經(jīng)通過(guò)javacpp,為opencv,ffmpeg,libdc1394,pgr flycapture,openkinect,videoinput,和artoolkitplus等圖像庫(kù)生成了完整的接口,集成到了他的開(kāi)源項(xiàng)目javacv當(dāng)中18。javacpp底層實(shí)現(xiàn)最開(kāi)始使用的是jna,后來(lái)又回到了jni10。2.4 android平臺(tái)數(shù)據(jù)的存儲(chǔ)與同步2.4.1 嵌入式關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)sqlitesqlite是一個(gè)包含一個(gè)自包含、無(wú)服務(wù)、零配制、事務(wù)型的sql數(shù)據(jù)庫(kù)引擎的軟件庫(kù)。它是世界上最流行的數(shù)據(jù)庫(kù)引擎之一。并且,sqlite的源代碼已經(jīng)進(jìn)入
31、了公共域,可自由使用11。android提供了對(duì)sqlite數(shù)據(jù)庫(kù)的完全支持。你所創(chuàng)建的任何數(shù)據(jù)庫(kù)都能被當(dāng)前應(yīng)用中的任何類(lèi)按名訪問(wèn),當(dāng)前應(yīng)用之外的類(lèi)則不行12。 sqlite 3中的數(shù)據(jù)類(lèi)型14大部分?jǐn)?shù)據(jù)庫(kù)引擎(就我們所知,除sqlite之外的任何其他數(shù)據(jù)庫(kù)引擎)使用著傳統(tǒng)的靜態(tài)類(lèi)型。靜態(tài)類(lèi)型下,一個(gè)值的數(shù)據(jù)類(lèi)型由其容器該值所存儲(chǔ)在的列所決定。sqlite使用一種更加泛化的動(dòng)態(tài)類(lèi)型系統(tǒng)。在sqlite中,一個(gè)值的數(shù)據(jù)類(lèi)型依賴(lài)于其值本身而非其容器。在其他靜態(tài)類(lèi)型數(shù)據(jù)庫(kù)上能使用的sql語(yǔ)言,在sqlite上同樣能使用;在這一意義上講,sqlite的這一動(dòng)態(tài)類(lèi)型系統(tǒng)相對(duì)其他數(shù)據(jù)庫(kù)的靜態(tài)
32、類(lèi)型系統(tǒng)具有向后兼容的能力。而且,sqlite中的動(dòng)態(tài)類(lèi)型能讓它完成傳統(tǒng)類(lèi)型數(shù)據(jù)庫(kù)所不能完成的工作。最后,值得注意的是,sqlite對(duì)特殊的一列rowid的處理。它與在android中對(duì)sqlite的訪問(wèn)密切相關(guān)。 rowid和整型主碼sqlite表的每一行都有一個(gè)64位有符號(hào)整數(shù)鍵,唯一地標(biāo)識(shí)表中該一行。該整數(shù)通常被稱(chēng)作“rowid”。rowid的值可使用以下任意列名的任意大小寫(xiě)形式訪問(wèn):“rowid”“oid”或“_rowid_”。如果一個(gè)表已經(jīng)存在了一個(gè)用戶(hù)定義的名叫“rowid”“oid”或“_rowid_”的列,則使用這些名字時(shí),訪問(wèn)的是用戶(hù)定義的列;這一整型rowid
33、行將不再能被檢索到15。sqlite的每一張表都以一棵b樹(shù)的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)。該樹(shù)包含了對(duì)每一行的一個(gè)入口,入口地址是一個(gè)整型主碼(integer primary key),或rowid。這意味著按rowid檢索或排序記錄速度極快。搜索某一指定或在某一范圍內(nèi)的rowid的行,比相同情況下在其他主碼或索引上搜索,要快一倍15。也正是這個(gè)原因,android中重要的ui組件listview訪問(wèn)sqlite數(shù)據(jù)庫(kù)所使用的適配器cursoradapter對(duì)查詢(xún)結(jié)果cursor的列有一個(gè)特殊的要求:必須要有一個(gè)名叫“_id”的列16。在實(shí)現(xiàn)上,listview的一行(即一個(gè)listitem)對(duì)應(yīng)cursor
34、的一行;據(jù)觀察,android為該listitem分配了id,其值正是“_id”列的值??赏ㄟ^(guò)以下方法獲得listview中的某一項(xiàng)的id:方法一:?jiǎn)螕袅斜眄?xiàng)的回調(diào)函void android.app.listactivity.onlistitemclick(listview l, view v, int position, long id)的形參中本身就有id;方法二:長(zhǎng)按列表項(xiàng),引起上下文菜單彈出的回調(diào)函數(shù)boolean android.app.activity.oncontextitemselected(menuitem item)中,可以這樣取得被長(zhǎng)按列表項(xiàng)的id:/獲取彈出菜單的菜單信
35、息;該菜單信息包含了適配器上下文信息,其中就包含了適配器為當(dāng)前列表項(xiàng)綁定的(cursor的)idadaptercontextmenuinfo info=(adaptercontextmenuinfo) item.getmenuinfo();/當(dāng)前列表項(xiàng)的idint id=info.id;此外,要獲取當(dāng)前列表項(xiàng)中子view的值,也有快捷的方法:/當(dāng)前列表項(xiàng)在適配器上的位置int position=info.position;/獲取適配器為當(dāng)前列表項(xiàng)綁定的cursor(或一行記錄)cursor cursor = (cursor) getlistadapter().getitem(position)
36、;/反過(guò)來(lái)獲取cursor中的列“_id”的值,與info.id對(duì)比string _id = cursor.getstring(cursor.getcolumnindex(_id);log.v(tag, _id at position + position + , id + id + is + _id);對(duì)比會(huì)發(fā)現(xiàn),無(wú)論對(duì)列表項(xiàng)進(jìn)行新增、刪除、排序等任何操作,id與_id均相同;相反,position表示的只是當(dāng)前列表項(xiàng)在列表listview中的下標(biāo),與id或_id沒(méi)有直接的關(guān)系。以上問(wèn)題是困擾作者本人在內(nèi)的許多開(kāi)發(fā)者許久的問(wèn)題。通過(guò)一定的分析和實(shí)驗(yàn),結(jié)果是可知的。這或許也是做開(kāi)發(fā)的樂(lè)趣之所在
37、。2.4.2 android平臺(tái)的數(shù)據(jù)同步android終端同web服務(wù)器、android終端與終端之間的數(shù)據(jù)同步,可以采用同android系統(tǒng)中谷歌帳戶(hù)應(yīng)用(gmail、google calendar等)類(lèi)似的方法,通過(guò)samplesyncadapter,利用android框架中的帳戶(hù)管理器和同步管理器實(shí)現(xiàn)。這里不再贅述。本文將討論的,是基于android 4.0及以上版本api中引入的最新技術(shù)端對(duì)端wi-fi直連通訊技術(shù)。 端對(duì)端wi-fi直連通訊技術(shù)從android 4.0(api 14)開(kāi)始,wi-fi直連通訊技術(shù)允許設(shè)備通過(guò)wi-fi直接(wi-fi direct)連接
38、,不再需要中間互連點(diǎn)(如無(wú)線路由器或wi-fi熱點(diǎn))。使用android所提供的api,你可以發(fā)現(xiàn)并連接到同樣支持wi-fi直接的設(shè)備上,然后與之進(jìn)行比藍(lán)牙距離更遠(yuǎn)的高速通信?;谠摷夹g(shù),我們構(gòu)想出了兩種多終端通信方式:1)c/s單向同步。2)對(duì)等雙向同步。鑒于實(shí)驗(yàn)條件不允許,我們僅對(duì)邏輯的實(shí)現(xiàn)作理論的分析。相信經(jīng)過(guò)這一分析,在android api 14實(shí)現(xiàn)起來(lái)是不難的。(1)c/s單向同步在該同步方式中,指定一臺(tái)設(shè)備作為服務(wù)器,或才最先啟動(dòng)同步服務(wù)的設(shè)備自動(dòng)作為服務(wù)器;其他設(shè)備作為客戶(hù)機(jī);首先輪流上傳各自的數(shù)據(jù),服務(wù)器負(fù)責(zé)數(shù)據(jù)的新增、更新與合并;然后輪流從服務(wù)器下載最新的數(shù)據(jù)。作為服務(wù)器的
39、設(shè)備(服務(wù)設(shè)備)首先啟動(dòng)同步服務(wù),其他設(shè)備(請(qǐng)求設(shè)備)搜尋到該設(shè)備,發(fā)送同步請(qǐng)求。服務(wù)設(shè)備在用戶(hù)的協(xié)助的對(duì)請(qǐng)求設(shè)備進(jìn)行身份認(rèn)證,并允許保存身份信息(即配對(duì))以供下次免認(rèn)證連接。服務(wù)設(shè)備上啟用一個(gè)服務(wù),或?yàn)槊總€(gè)設(shè)備啟用一個(gè)服務(wù),響應(yīng)所有設(shè)備發(fā)送過(guò)來(lái)的通知(包含對(duì)數(shù)據(jù)變更的描述和數(shù)據(jù)本身)。響應(yīng)操作包括:備份同步前的數(shù)據(jù);新增設(shè)備新增的記錄,緩存設(shè)備的修改和刪除請(qǐng)求并在最后提示用戶(hù)確認(rèn)(修改或刪除),最后標(biāo)記版本。全部設(shè)備的變更上傳完成后,服務(wù)設(shè)備轉(zhuǎn)而向所有請(qǐng)求設(shè)備發(fā)送指令,備份并刪除其同步前數(shù)據(jù),并下載同步后的數(shù)據(jù)。(2)對(duì)等雙向同步在該同步方式中,設(shè)備間對(duì)等通信,向其他配對(duì)設(shè)備播送自身數(shù)據(jù)的變
40、化,同時(shí)接收與處理其他配對(duì)設(shè)備數(shù)據(jù)變化的通知。該方式與c/s單向同步的不同之處在于,設(shè)備同時(shí)扮演兩種角色:服務(wù)設(shè)備和請(qǐng)求設(shè)備;無(wú)需下載同步后數(shù)據(jù)。兩種同步方式都希望所有設(shè)備在當(dāng)時(shí)當(dāng)?shù)乜捎?,否則每一部設(shè)備上的數(shù)據(jù)都不是嚴(yán)格意義上“最新”的數(shù)據(jù)。但在實(shí)際應(yīng)用中,對(duì)“最新”的要求并不高;相反,每周一次的同步(比如在例會(huì)與工作總結(jié)時(shí)同步工作數(shù)據(jù)),在同步時(shí)展示與統(tǒng)計(jì)每一部終端的數(shù)據(jù)變更,反而有得于對(duì)工作的評(píng)價(jià)。3 需求分析從本章開(kāi)始,我們將回到緒論中所描述的問(wèn)題,應(yīng)用前面兩章所提供的技術(shù)手段,分析、設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基于android平臺(tái)的車(chē)輛信息查詢(xún)系統(tǒng)。需求分析是系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)的前提,也是軟件開(kāi)發(fā)生命
41、周期中最重要的一步。在面向?qū)ο蟮男枨蠓治龇椒ㄖ?,uml模型圖起到了十分關(guān)鍵的作用。本章通過(guò)用例圖來(lái)提取與靜態(tài)地描述需求,通過(guò)交互圖來(lái)動(dòng)態(tài)地描述需求,以供總體設(shè)計(jì)中類(lèi)與實(shí)體的提取、類(lèi)圖和實(shí)體關(guān)系圖的生成。3.1 功能需求我們將通過(guò)建立用例圖來(lái)逐步描述、抽象、細(xì)化功能需求。3.1.1 opencvopencv(開(kāi)源計(jì)算機(jī)視覺(jué))是一個(gè)用于實(shí)時(shí)計(jì)算機(jī)視覺(jué)的程序函數(shù)庫(kù)。它在bsd許可下發(fā)布,學(xué)術(shù)和商業(yè)上均可免費(fèi)使用。它擁有能運(yùn)行在windows、linux、android以及mac上的c+、c、pythoon和java的接口。該庫(kù)擁有超過(guò)2500個(gè)算法的優(yōu)化。使用者遍布全球,擁有2,500,000以上的
42、下載量和40,000用戶(hù)組成員。使用范圍從交互藝術(shù)到礦物探測(cè),再到web圖形檢索等領(lǐng)域20。opencv由英特爾公司于1999年起開(kāi)發(fā),用c/c+寫(xiě)成,包含了500多個(gè)函數(shù)。opencv的構(gòu)成如圖2。cxcore基本結(jié)構(gòu)和算法,xml支持,繪圖函數(shù)cv圖像處理和視覺(jué)算法highguigui,圖像和視頻 i/o圖2 opencv的構(gòu)成3.1.2 javacvjavacv是一個(gè)opencv的java接口。它為計(jì)算機(jī)視覺(jué)領(lǐng)域調(diào)查者們常用的庫(kù)提供了封裝。這些庫(kù)包括:opencv,ffmpeg,libdc1394,pgr flycapture,openkinect,videoinput,和artoolk
43、itplus等。com.googlecode.javacv.cpp包命名空間下的類(lèi)便展示出了完整的api。并且,實(shí)用類(lèi)還使自身的功能在java平臺(tái)包括android平臺(tái)上更加可用21。javacv開(kāi)源項(xiàng)目的負(fù)責(zé)人samuel,即前述javacpp項(xiàng)目的負(fù)責(zé)人。javacv正是利用javacpp技術(shù)實(shí)現(xiàn)的opencv的java接口。編譯或生成javacpp.jar和javacv.jar,作為本項(xiàng)目的引用包;將javacv-android-arm.jar和opencv-2.4.0-android-arm.zip中所有的庫(kù)文件解壓至項(xiàng)目根目錄下的libs/armeabi文件夾中,即完成了對(duì)javac
44、v庫(kù)引用。項(xiàng)目目錄結(jié)構(gòu)如圖3。具體請(qǐng)參照項(xiàng)目主頁(yè)的介紹。圖3 androidviq項(xiàng)目目錄結(jié)構(gòu)3.2 車(chē)牌探測(cè)在圖像處理技術(shù)中,haar特征提取技術(shù)常用于從圖像中提取物體22。該技術(shù)涉及神經(jīng)網(wǎng)絡(luò)等算法,限于知識(shí)水平,暫不研究。邊緣檢測(cè)作為一種簡(jiǎn)單的物體檢測(cè)方法,特別適合于矩形外框的車(chē)牌。本課題采用基于邊緣檢測(cè)的車(chē)牌探測(cè)技術(shù)。原始車(chē)輛圖像如圖4。圖4 原始車(chē)輛圖像3.2.1 將原始圖像轉(zhuǎn)化為灰階圖像cvcvtcolor(mvehicleimage, vehicleimagegray, cv_bgr2gray);圖5 灰階圖像3.2.2 灰階圖像的平滑與增強(qiáng)處理cvsmooth(vehicleim
45、agegray, vehicleimagegray, cv_gaussian, 3);cvequalizehist(vehicleimagegray, vehicleimagegray);圖6 平滑與增強(qiáng)過(guò)后的灰階圖像3.2.3 灰階圖像轉(zhuǎn)化為二值圖像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 基于邊緣檢測(cè)的車(chē)牌探測(cè)經(jīng)檢測(cè),提取的圖像輪廓中有約1800個(gè)獨(dú)立輪廓區(qū)域。我們這樣來(lái)找到車(chē)牌輪廓區(qū)域:用指定精度逼近曲線輪廓,形成一個(gè)多邊形輪廓;如果多邊形為四邊形,面積足夠大,且寬高比介于2.8到3.4之間(普通車(chē)牌外廓尺寸為440mm140mm,寬高比為3.14),則可初步判斷它為車(chē)牌輪廓,接下來(lái)的工作將圍繞該區(qū)域展
47、開(kāi)。示例代碼如下:/獲得多邊形輪廓cvseq polycontours = cvapproxpoly(contours, loader.sizeof(cvcontour.class), cvcreatememstorage(0), cv_poly_approx_dp, cvcontourperimeter(contours) * 0.05, 0);/檢查輪廓邊數(shù)和面積 if (polycontours.total() = 4 & cvcontourarea(polycontours, cv_whole_seq, 0) 600) /獲得輪廓外框cvrect boundingrect = cvbo
48、undingrect(polycontours, 0);/檢查輪廓寬高比 double plate_hwratio = (double) boundingrect.width() / (double) boundingrect.height(); if (plate_hwratio 2.8 & plate_hwratio 3.4) /設(shè)置原來(lái)備份的車(chē)輛灰度圖像的roi(感興趣區(qū)域) cvsetimageroi(vehicleimagegrayclone, boundingrect);/接下來(lái):進(jìn)行車(chē)牌字符的分割 /todo: character segmentation on the lice
49、nce image 檢測(cè)出的車(chē)牌圖像如圖9。于是,接下來(lái)將進(jìn)行車(chē)牌字符的分割。(車(chē)牌的偏斜矯正一般情況下沒(méi)有必要,本文不討論。)圖9 檢測(cè)出的車(chē)牌圖像3.3 車(chē)牌字符分割對(duì)于原來(lái)備份的車(chē)輛灰度圖像,在設(shè)置好roi車(chē)牌區(qū)域之后,進(jìn)行canny邊緣檢測(cè),獲得車(chē)牌圖像的輪廓,如圖10。圖10 車(chē)牌圖像的輪廓/對(duì)車(chē)牌圖像進(jìn)行邊緣檢測(cè)cvcanny(licenceimage, plateimagecanny, 128, 255, 3);同樣通過(guò)cvfindcontours()函數(shù)找到連續(xù)的輪廓,逐一判斷是否為車(chē)牌字符。判斷方法為:輪廓的外框,高度大于車(chē)牌高度的二分之一,且寬度小于車(chē)牌寬度的四分之一者,即
50、為車(chē)牌字符。以此,車(chē)牌中的點(diǎn)號(hào)、孔隙和小范圍的污點(diǎn)均已被自動(dòng)去除。所得的單個(gè)的字符如圖11。 圖11 分割后的車(chē)牌字符分割后的字符,可以單獨(dú)識(shí)別,也可以拼接后一起識(shí)別,如圖12。為了提高識(shí)別率,還可以增加字符與背景的對(duì)比度,并應(yīng)準(zhǔn)偱ocr引擎對(duì)前景背景色的要求。圖12 分割后再合并的車(chē)牌字符3.4 車(chē)牌字符識(shí)別3.4.1 tesseract ocr引擎tesseract ocr引擎是1995年unlv accuracy大賽中的排名前三的引擎。1995年到2006年間,它沒(méi)有大的改進(jìn);之后,它被谷歌大幅改進(jìn),很可能是識(shí)別率最高的可用開(kāi)源ocr引擎之一了。結(jié)合leptonica圖像處理庫(kù),它能讀取
51、各種各樣格式的圖像文件,識(shí)別出超過(guò)40多種語(yǔ)言的文本23。目前該引擎已經(jīng)對(duì)中文識(shí)別有了一定的支持。然而對(duì)于大陸車(chē)牌文字,它的識(shí)別率并不高。原因在于,國(guó)家車(chē)牌字符使用的是一種特殊的字符,以便于區(qū)分。它不同于標(biāo)準(zhǔn)印刷符。因此須為tesseract ocr引擎訓(xùn)練出專(zhuān)供車(chē)牌識(shí)別的語(yǔ)言包。3.4.2 車(chē)牌語(yǔ)言的訓(xùn)練車(chē)牌語(yǔ)言訓(xùn)練的過(guò)程,就是提供給計(jì)算機(jī)目標(biāo)文字圖像及相應(yīng)的文字,讓計(jì)算機(jī)自動(dòng)分析并存儲(chǔ)這一對(duì)應(yīng)關(guān)系的過(guò)程。tesseract為訓(xùn)練過(guò)程提供了一定的支持。首先,取得帶標(biāo)準(zhǔn)車(chē)牌文字的圖像文件。ga 36-2007 中華人民共和國(guó)機(jī)動(dòng)車(chē)號(hào)牌b.1 外廓尺寸為440mm140mm的號(hào)牌1,是最佳的材料
52、。然后,將它們上下拼接成一幅圖像,保存成tiff格式。圖像寬高建議為1056*2000(單位像素),圖像分辨率96dpi,命名為“l(fā)f.exp10.tif”。之所以將三類(lèi)圖像拼接成一幅圖像,一方面是應(yīng)官方文檔要求,一類(lèi)字體一幅圖片,三類(lèi)字符同屬一種字符(這里命名為“cnlf”);另一方面是為了簡(jiǎn)化訓(xùn)練過(guò)程。如圖13(由于警車(chē)車(chē)牌不在本課題討論范圍之內(nèi),為簡(jiǎn)化操作,未將其包含進(jìn)來(lái))。圖13 車(chē)牌字符訓(xùn)練圖片圖14 連通多部首漢字以簡(jiǎn)化盒子文件的修改接下來(lái)開(kāi)始生成中間文件。首先在計(jì)算機(jī)上安裝tesseract引擎(目前是tesseract-ocr-setup-3.01-1.exe )
53、。然后,在命令行執(zhí)行以下命令:tesseract cnlp.lpft.exp10.tif cnlp.lpft.exp10 batch.nochop makebox該命令將使用默認(rèn)的語(yǔ)言(英文)對(duì)lf.exp10.tif進(jìn)行識(shí)別。識(shí)別結(jié)果將生成盒子文件文件cnlp.lpft.exp10.box,文件中每一行均為所識(shí)別出的字符、其在訓(xùn)練圖片中的坐標(biāo)(四列分別是左、下、右、下,坐標(biāo)原點(diǎn)為圖片左下角)以及頁(yè)號(hào)(單頁(yè)訓(xùn)練圖片頁(yè)號(hào)恒為0)。對(duì)使用默認(rèn)語(yǔ)言自動(dòng)生成的盒子文件進(jìn)行一定的修改,再輸入計(jì)算機(jī),即完成了新語(yǔ)言學(xué)習(xí)中的重要一步。如果自動(dòng)生成的盒子文件中的字符能與正確字符良好對(duì)應(yīng)(如本訓(xùn)練圖
54、片中的數(shù)字1在盒子文件中被識(shí)別成了“|”),修改例子文件將非??旖?,改正字符即可;如果一個(gè)字符被tesseract解釋成了多個(gè)字符(如“蘇”被解析成了“艸”和“辦”),在盒子文件中得到了多行記錄,則需要采取一定的手段找到所識(shí)別行與目標(biāo)字符的對(duì)應(yīng)關(guān)系,并合并錯(cuò)誤的行。具體參考官方文檔訓(xùn)練tesseract324。其實(shí),針對(duì)上述問(wèn)題,有一個(gè)簡(jiǎn)單的辦法。問(wèn)題的原因在于漢字字符多偏旁部首,容易被tesseract當(dāng)作多個(gè)字符對(duì)待;生成盒子文件的目的,只是用文本文件表示出目標(biāo)字符及其在訓(xùn)練圖片中的區(qū)域。因此,我們可以為不連通的字符添上筆畫(huà),使之完全連通。在識(shí)別出盒子后,再換回原圖,用于接下來(lái)的特征記錄。
55、圖14便能完好地生成72行字符數(shù)據(jù)。接下來(lái)的工作要簡(jiǎn)單得多。按訓(xùn)練tesseract3中的步驟:/訓(xùn)練tesseract:tesseract cnlp.lpft.exp10.tif cnlp.lpft.exp10 nobatch box.train/計(jì)算字符集:unicharset_extractor cnlp.lpft.exp10.box/讀取字體屬性:(新建字體屬性文件font_properties,內(nèi)容為“l(fā)pft 0 0 1 0 0”)mftraining -f font_properties -u unicharset cnlp.lpft.exp10.tr/分類(lèi)歸并:mftraini
56、ng -f font_properties -u unicharset -o cnlp.unicharset cnlp.lpft.exp10.trcntraining cnlp.lpft.exp10.tr/其他文件(數(shù)據(jù)字典、unicharambigs)均不必提供。/匯集所有中間文件,生成語(yǔ)言包:(先須為normproto、microfeat、inttemp、pffmtable 和unicharset等文件加上語(yǔ)言名前綴,這里用“cnl.”;語(yǔ)言名建議遵循iso 639-2標(biāo)準(zhǔn))combine_tessdata cnl.不出意外,專(zhuān)用車(chē)牌語(yǔ)言包c(diǎn)nl.traineddata即生成成功!cnl.
57、traineddata同樣可在參考文獻(xiàn)25中下載得到。重要提醒:訓(xùn)練語(yǔ)言包的過(guò)程中,可能會(huì)有這樣或那樣的問(wèn)題。多嘗試,多分析,查閱tessearct項(xiàng)目的問(wèn)題列表,并勇于提問(wèn),最終一定能成功。關(guān)于上述過(guò)程的討論,詳見(jiàn)tessearct項(xiàng)目第557號(hào)問(wèn)題討論25。3.4.3 tesseract庫(kù)在android中的使用tesseract庫(kù)在android中的使用,同樣由jni實(shí)現(xiàn)。開(kāi)源項(xiàng)目tesseract-android-tools26是一個(gè)android庫(kù)項(xiàng)目27,提供了用于使用tesseract ocr和leptonica圖像處理庫(kù)的一系列android api和構(gòu)建文件。該項(xiàng)目的目錄結(jié)構(gòu)如圖15。圖15 項(xiàng)目tesseract-android-tools的目錄結(jié)構(gòu)共享庫(kù)liblept.so和libtess.so可以直接通過(guò)ndk編譯生成;目錄jin下存放的是這兩個(gè)庫(kù)的c/c+源文件和編譯指令。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人業(yè)績(jī)合同樣本
- 產(chǎn)品購(gòu)貨合同樣本
- 關(guān)于教師聘用合同樣本
- 買(mǎi)賣(mài)舊設(shè)備合同樣本
- 任務(wù)合同樣本
- 個(gè)人廂房出售合同標(biāo)準(zhǔn)文本
- 公戶(hù)賬務(wù)往來(lái)合同樣本
- 牌照出租合同范本
- 供水設(shè)備合同樣本
- 調(diào)酒師必考知識(shí)點(diǎn)及試題及答案
- (T8聯(lián)考)2025屆高三部分重點(diǎn)中學(xué)12月第一次聯(lián)考評(píng)物理試卷(含答案詳解)
- 【MOOC】化工安全(下)-華東理工大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2024年10月廣東高等教育自學(xué)考試5743基礎(chǔ)營(yíng)養(yǎng)學(xué)試題及答案
- 《連續(xù)性腎替代治療容量評(píng)估與管理專(zhuān)家共識(shí)》解讀課件
- 第4課《我們的公共生活》第1課時(shí)(教學(xué)設(shè)計(jì))-部編版道德與法治五年級(jí)下冊(cè)
- 寵物店寵物活動(dòng)策劃合同
- 盾構(gòu)施工關(guān)鍵技術(shù)知識(shí)考試題庫(kù)及答案
- 《2024年 大學(xué)計(jì)算機(jī)基礎(chǔ)考試系統(tǒng)的分析與設(shè)計(jì)》范文
- 廣東省珠海市香洲區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期末歷史試題(解析版)
- 鳶飛魚(yú)躍:〈四書(shū)〉經(jīng)典導(dǎo)讀智慧樹(shù)知到答案2024年四川大學(xué)
- 2024年浙江省初中學(xué)業(yè)水平考試社會(huì)試題(解析版)
評(píng)論
0/150
提交評(píng)論