【正文】
在對表的描述中,提到了“候選碼”而非“主碼”是因為,我們將使用一個整型自增片段作為主碼,以與更加方便地與列表適配器(ListAdapter)相匹配(見“ROWID和整型主碼”一小節(jié)的描述),在一定程度上提升代碼編寫效率和程序運行效率。圖23類“VehicleItemViewActivity”的實現(xiàn)其他類,包括Android提供的API和用戶自定義的類,遵循高內(nèi)聚、低耦合的原則以及其他一些規(guī)范即可。3) 重寫創(chuàng)建上下文菜單onCreateContextMenu()和用戶選擇上下文菜單onContextMenuSelected()時的回調(diào)函數(shù),設置上下文菜單及菜單被點擊時相應的操作。圖像識別過程中,如果檢測到SD卡上不存在該語言包,則自動將其復制到SD卡特定目錄(本項目使用TesseractOCR語言包標準目錄/sdcard/tesseract/tessdata/)下。本項目中。項目JavaCV的編譯,對平臺的要求較多。項目tesseractandroidtools使用JNI技術調(diào)用上述本地代碼。 支撐代碼庫(1)tesseractandroidtools開源項目tesseractandroidtools中jin目錄下是圖像識別庫TesseractOCR和圖像處理庫Leptonica的C/C++本地代碼。c) 短信(SEND_SMS)。d) 移動網(wǎng)絡或WiFi(非必須),用于輔助GPS定位,將地理坐標轉(zhuǎn)化為實際地點名,以及同步車輛數(shù)據(jù)。b) GPS(非必須),用于自動獲取當前地理坐標,車輛登記記錄中的數(shù)據(jù)項。b) 用戶界面的文本,使用資源文件res/values/,可迅速增加新語言()。5) 真實Android設備(可使用模擬器替代),本項目采用小米手機MIONE PLUS。本項目采用Indigo Service Release 2。其中備注字段來自于車輛登記單。值得注意的是,車輛登記單的車牌號并不參照車輛信息庫的車牌號,因為根據(jù)業(yè)務需求,所登記車輛并不一定在車輛信息庫中存在;如果不存在,還可以隨時將該車信息加入車輛信息庫。其中車牌號為候選碼。4) 車輛照片異步緩沖與加載線程類ViqCachedImageFetcher,負責將指定路徑的圖像文件綁定到指定的圖像視圖中。圖21 用例“瀏覽車輛信息庫”和“瀏覽車輛登記單”實際的類圖除這兩個用例具有巨大的相似性,發(fā)生了繼承關系之外,其他用例均以一個相對獨立的類、監(jiān)聽器、回調(diào)函數(shù)或方法實現(xiàn)。從根源分析,二者的區(qū)別僅在于:1) 用戶界面的標題和菜單文本略有不同;2) 列表項綁定的數(shù)據(jù)以及列表項的布局不同;3) 相應地,對列表項的操作也略有不同。 非功能需求結(jié)合Android手機的特性和使用場景,對系統(tǒng)提出如下非功能需求:1) 可用性a) 速度快:車牌識別時間不超過1s;在有1000條左右數(shù)據(jù)項的情況下,b) 準確性:在車輛前方5m處拍攝車輛整車照片,車牌識別準確率達50%以上2) 易用性a) 業(yè)務流程簡單,無學習成本b) 搖一搖,即可快速進入車輛登記模式c) 重要功能一鍵可達d) 即編即達,保證用戶編輯的數(shù)據(jù)不致意外丟失;提供重置編輯、撤消編輯等功能3) 安全性a) 所有車輛照片存儲在SD卡特定的目錄下(可設置隱藏),用戶不致錯誤刪除,并可定期備份b) 數(shù)據(jù)庫定期在SD卡備份c) 可與同步服務器同步數(shù)據(jù)4) 健壯性a) 妥善處理SD卡不可用、文件不存在等異常5) 可移植性a) 適應99%的Android設備,適應各種分辨率b) 可支持多種地區(qū)/語言c) 安裝方便,無需另行下載相關依賴數(shù)據(jù)6) 可維護性a) 日志記錄,便于跟蹤、診斷缺陷或失效原因5 系統(tǒng)設計、實現(xiàn)與測試 系統(tǒng)的設計系統(tǒng)的設計包含總體設計和詳細設計,我們在此僅討論總體設計。UI類的交互圖如圖20。這正是信息系統(tǒng)的運行方式。繼而,用戶通過選擇“編輯”菜單,向類“車輛查看頁”發(fā)送“編輯”消息;類“車輛查看頁”將該消息連同車輛ID發(fā)送給類”車輛信息編輯頁”。在用例“編輯車輛信息”中,需要修改車輛信息中的某一字段,比如車主電話。以用例“編輯車輛信息”為例。當識別率低于某一閾值時,手工輸入方式將同樣用來更正圖像識別方式所得的車牌號。(2)瀏覽車輛登記單以列表形式顯示所有的車輛登記記錄;列表項包括登記時拍攝的車輛圖片,通過圖片識別出來或手工輸入的車牌號,通過車牌號在車輛信息庫中查到的車主姓名和電話,登記的時間和地點,以及備注等內(nèi)容。圖18 細化并擴展了的用例模型如圖18中所示,系統(tǒng)有四個主要功能(或用例):瀏覽車輛信息庫,瀏覽車輛登記單,查詢/登記車輛,查看車輛。用例圖如圖16。本章通過用例圖來提取與靜態(tài)地描述需求,通過交互圖來動態(tài)地描述需求,以供總體設計中類與實體的提取、類圖和實體關系圖的生成。關于本問題折討論,詳見tesseractandroidtools項目第119號問題[29]。兩種做法本質(zhì)是一樣的。l void (Pix image)設置待識別圖像。它并沒有實現(xiàn)所有可用的JNI方法,不過實現(xiàn)的方法已經(jīng)夠用。該項目的目錄結(jié)構(gòu)如圖15。多嘗試,多分析,查閱Tessearct項目的問題列表,并勇于提問,最終一定能成功。接下來的工作要簡單得多。問題的原因在于漢字字符多偏旁部首,容易被tesseract當作多個字符對待;生成盒子文件的目的,只是用文本文件表示出目標字符及其在訓練圖片中的區(qū)域。對使用默認語言自動生成的盒子文件進行一定的修改,再輸入計算機,即完成了新語言學習中的重要一步。 圖13 車牌字符訓練圖片 圖14 連通多部首漢字以簡化盒子文件的修改接下來開始生成中間文件。然后,將它們上下拼接成一幅圖像,保存成TIFF格式。 車牌語言的訓練車牌語言訓練的過程,就是提供給計算機目標文字圖像及相應的文字,讓計算機自動分析并存儲這一對應關系的過程。然而對于大陸車牌文字,它的識別率并不高。圖12 分割后再合并的車牌字符 車牌字符識別 Tesseract OCR引擎Tesseract OCR引擎是1995年UNLV Accuracy大賽中的排名前三的引擎。以此,車牌中的點號、孔隙和小范圍的污點均已被自動去除。)圖9 檢測出的車牌圖像 車牌字符分割對于原來備份的車輛灰度圖像,在設置好ROI——車牌區(qū)域之后,進行Canny邊緣檢測,獲得車牌圖像的輪廓,如圖10。 plate_HWratio ) {//設置原來備份的車輛灰度圖像的ROI(感興趣區(qū)域) cvSetImageROI(vehicleImageGrayClone, boundingRect)。 cvContourArea(polyContours, CV_WHOLE_SEQ, 0) 600) {//獲得輪廓外框CvRect boundingRect = cvBoundingRect(polyContours, 0)。我們這樣來找到車牌輪廓區(qū)域:用指定精度逼近曲線輪廓,形成一個多邊形輪廓;如果多邊形為四邊形,面積足夠大,(普通車牌外廓尺寸為440mm140mm,),則可初步判斷它為車牌輪廓,接下來的工作將圍繞該區(qū)域展開。圖6 平滑與增強過后的灰階圖像 灰階圖像轉(zhuǎn)化為二值圖像cvThreshold(vehicleImageGray, vehicleImageBinary, 128, 255, CV_THRESH_BINARY)。原始車輛圖像如圖4。圖3 AndroidVIQ項目目錄結(jié)構(gòu) 車牌探測在圖像處理技術中,Haar特征提取技術常用于從圖像中提取物體[22]。JavaCV正是利用JavaCPP技術實現(xiàn)的OpenCV的Java接口。它為計算機視覺領域調(diào)查者們常用的庫提供了封裝。使用范圍從交互藝術到礦物探測,再到Web圖形檢索等領域[20]。它在BSD許可下發(fā)布,學術和商業(yè)上均可免費使用。下面對其分別進行描述并加以實現(xiàn)。兩種同步方式都希望所有設備在當時當?shù)乜捎?,否則每一部設備上的數(shù)據(jù)都不是嚴格意義上“最新”的數(shù)據(jù)。響應操作包括:備份同步前的數(shù)據(jù);新增設備新增的記錄,緩存設備的修改和刪除請求并在最后提示用戶確認(修改或刪除),最后標記版本。(1)C/S單向同步在該同步方式中,指定一臺設備作為服務器,或才最先啟動同步服務的設備自動作為服務器;其他設備作為客戶機;首先輪流上傳各自的數(shù)據(jù),服務器負責數(shù)據(jù)的新增、更新與合并;然后輪流從服務器下載最新的數(shù)據(jù)?;谠摷夹g,我們構(gòu)想出了兩種多終端通信方式:1)C/S單向同步。這里不再贅述。以上問題是困擾作者本人在內(nèi)的許多開發(fā)者許久的問題。//獲取適配器為當前列表項綁定的Cursor(或一行記錄)Cursor cursor = (Cursor) getListAdapter().getItem(position)。在實現(xiàn)上,ListView的一行(即一個ListItem)對應Cursor的一行;據(jù)觀察,Android為該ListItem分配了id,其值正是“_id”列的值。該樹包含了對每一行的一個入口,入口地址是一個整型主碼(INTEGER PRIMARY KEY),或rowid。該整數(shù)通常被稱作“rowid”。而且,SQLite中的動態(tài)類型能讓它完成傳統(tǒng)類型數(shù)據(jù)庫所不能完成的工作。靜態(tài)類型下,一個值的數(shù)據(jù)類型由其容器——該值所存儲在的列——所決定。并且,SQLite的源代碼已經(jīng)進入了公共域,可自由使用[11]。JavaCPP項目的作者samuel已經(jīng)通過JavaCPP,為OpenCV,F(xiàn)Fmpeg,libdc1394,PGR FlyCapture,OpenKinect,videoInput,和ARToolKitPlus等圖像庫生成了完整的接口,集成到了他的開源項目JavaCV當中[18]。JNA源代碼可從GitHub獲得[11]。JNA堪比Window的P/Invoke和Python的ctype。2)JNA(Java Native Access)JNA,Java本地訪問,是SUN公司主導研發(fā)的,建立在經(jīng)典的JNI的基礎之上的一個開源框架。1)JNI(Java Native Interface)JNI,Java本地接口,是一個允許運行在Java虛擬機上的Java代碼調(diào)用本地代碼或被本地代碼調(diào)用的應用編程框架。不同于其他的系統(tǒng),Android應用程序沒有唯一的入口(比如就沒有main()函數(shù))[6]。Activity負責呈現(xiàn)用戶界面并與用戶交互;Service運行在后臺,負責處理耗時操作,或是為服務遠程進程;Content Provider負責管理可被共享的應用程序數(shù)據(jù);Broadcast receiver則能響應系統(tǒng)級的廣播消息。Java代碼被編譯成字節(jié)碼,以在Dalvik虛擬機上高效運行。 Android平臺本地應用的開發(fā)同PC上應用的部署模式一樣,Android應用也可有純本地應用,C/S模式和B/S模式。提供SGL底層2D繪圖引擎,安全套接層,嵌入式標準C庫,OpenGL 3D繪圖,F(xiàn)reeType字體,瀏覽器核心,用戶空間顯示管理,媒體框架,以及輕量級SQLite關系型數(shù)據(jù)庫。描述如下:l 應用層:包括由系統(tǒng)默認提供了桌面、聯(lián)系人、通話、瀏覽器等基礎應用,以及由廣大開發(fā)人員開發(fā)、可下載安裝的拓展應用。一款受歡迎的應用的市場價值十分巨大,而且這一市場才剛剛起步。移動平臺是目前和將來相當一段時間應用部署的重要平臺。這將極大地改變?nèi)藗兊纳罘绞胶凸ぷ鞣绞絒3]。第六章總結(jié)全文,并對接下來的工作提出展望與規(guī)劃。第三章介紹車牌識別的理論、技術以及在Android平臺上的實現(xiàn)。上述應用場景要求移動智能設備有拍照、自動車牌識別、自動記錄時間和地點、快速查詢車輛信息、保存車輛信息等功能。如果找不到擁有該車牌號的合法計程車信息,則可進一步追查;如果找到,通過照片對比和詢問車主現(xiàn)在的位置,即可判斷該車是否真實。2)“黑的”鑒別武漢現(xiàn)有的違法運營計程車(俗稱“黑的”),目前有超過4000輛[2]。對違規(guī)停放的車輛也可作相同的處理。這些信息在實際典型場景中的應用,舉例如下:1)小區(qū)(停車場)車輛管理目前,很多小區(qū)都為戶主分配了專用的停車車位,車位未經(jīng)允許被占用的現(xiàn)象卻時有發(fā)生,在一定程度上擾亂了社區(qū)的和諧。Android終端在扮演這一角色的過程中,有兩大問題需要解決:一、有限的計算能力,如何快速準確地進行車牌識別,以自動查詢車輛信息,并對車輛信息進行結(jié)構(gòu)化記錄;二、多終端協(xié)同工作,在網(wǎng)絡不可靠的情況下,如何獲取與存儲數(shù)據(jù),又如何在一定程度上保持數(shù)據(jù)的同步,以共享最新的車輛信息,或供進行統(tǒng)計與決策。這此無疑增加了車輛信息管理的成本,制約了車輛信息數(shù)字化的進程。 SQLite1 緒論隨著國民經(jīng)濟的發(fā)展,車輛迅速普及。 information system。 source codes are easy to get and available for mercial use。 introduced related theory and technology basis。 SQLiteAbstractThis 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 reco