基于EasyPR的智慧停車輔助系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
基于EasyPR的智慧停車輔助系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
基于EasyPR的智慧停車輔助系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
基于EasyPR的智慧停車輔助系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
基于EasyPR的智慧停車輔助系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

.3.2智慧停車輔助管理系統(tǒng)用戶停止視頻播放后系統(tǒng)的管理流程辦法:客戶端將記錄視頻播放時(shí)長(zhǎng)的信息發(fā)給服務(wù)器后等待服務(wù)器確認(rèn)便關(guān)閉該通道的網(wǎng)絡(luò)連接,播放界面變?yōu)楹谄痢V饕鞒倘鐖D3-8所示。圖3-8系統(tǒng)管理流程設(shè)計(jì)3.3.3斷線重連處理設(shè)備通電后,將在設(shè)備和服務(wù)器之間建立持久連接。但是,由于網(wǎng)絡(luò)中斷或其他因素,數(shù)據(jù)傳輸過(guò)程中可能會(huì)出現(xiàn)中斷。在這種情況下,服務(wù)器必須采取主動(dòng)措施來(lái)終止SOCKET連接并刪除所有存儲(chǔ)在客戶端的數(shù)據(jù)?;蛘撸蛻舳吮仨氃谟脩艚缑嫔巷@示有關(guān)斷開連接的網(wǎng)絡(luò)狀態(tài)的通知。但是,設(shè)備無(wú)法重新啟動(dòng),并且每個(gè)工作單元都保持等待狀態(tài),直到網(wǎng)絡(luò)連接恢復(fù)。因此,客戶端必須定期啟動(dòng)重新連接,以確保實(shí)施及時(shí)有效的措施來(lái)建立連續(xù)連接。對(duì)于系統(tǒng)的穩(wěn)定性和可靠性至關(guān)重要的是,需要保證采取有效措施保持持續(xù)連接。3.3.4心跳實(shí)現(xiàn)由于線路等原因,運(yùn)行過(guò)程有“斷線”發(fā)生的情況,此時(shí)兩端設(shè)備的程序都沒(méi)有偵測(cè)到。當(dāng)發(fā)生這樣的狀況時(shí),為了使系統(tǒng)快速發(fā)現(xiàn)以便斷線重連機(jī)制啟動(dòng),應(yīng)該在客戶端設(shè)計(jì)一個(gè)“心跳包”用來(lái)定時(shí)發(fā)送測(cè)試。同時(shí),為了減輕服務(wù)器端的壓力,服務(wù)器可以直接丟棄各個(gè)客戶端發(fā)來(lái)的心跳包;服務(wù)器沒(méi)接到客戶端的包,服務(wù)器會(huì)保持這個(gè)客戶端的心跳時(shí)長(zhǎng);而當(dāng)心跳時(shí)長(zhǎng)清零時(shí)則說(shuō)明服務(wù)器已經(jīng)接收到對(duì)面發(fā)送的心跳包了;如果未在規(guī)定時(shí)間間隔內(nèi)收到,則累計(jì)心跳時(shí)長(zhǎng),累計(jì)到規(guī)定的時(shí)長(zhǎng)后,說(shuō)明客戶端已經(jīng)很久沒(méi)有發(fā)送“心跳包”了,此時(shí)服務(wù)器自動(dòng)判定客戶端已經(jīng)斷線,然后SOCKET連接被動(dòng)關(guān)閉。另外一個(gè)解決方案就是打開TCP協(xié)議的keep-alive選項(xiàng),設(shè)定發(fā)送間隔,讓協(xié)議棧來(lái)偵測(cè)線路(協(xié)議棧本身完成“心跳”),一旦發(fā)現(xiàn)線路中斷,則會(huì)SOCKETAPI函數(shù)通知應(yīng)用程序。3.4通信可靠性設(shè)計(jì)在通信服務(wù)器和客戶端進(jìn)行數(shù)據(jù)上傳和交換的過(guò)程中,必須考慮以下4種情況:比如客戶端已經(jīng)上傳了用戶的數(shù)據(jù),且客戶端發(fā)送出的數(shù)據(jù)已經(jīng)被通信服務(wù)器接收,但數(shù)據(jù)超時(shí)上傳被截停REF_Ref28913\r\h[20]。具體可以參考TCP的“四握手”協(xié)議。為了解決以上問(wèn)題,嘗試方案如下:假設(shè)交互周期不超過(guò)30秒的標(biāo)準(zhǔn),在交易數(shù)據(jù)傳輸后,設(shè)備客戶端將等待服務(wù)器響應(yīng)。如果服務(wù)器在一分鐘內(nèi)失敗未能響應(yīng),則客戶端將執(zhí)行3次查詢嘗試,每次間隔為30秒。如果服務(wù)器在任何時(shí)候響應(yīng),則表明數(shù)據(jù)上傳成功。不過(guò),在響應(yīng)失敗的情況下,客戶端將顯示"未知錯(cuò)誤,請(qǐng)檢查您的網(wǎng)絡(luò)設(shè)置"的錯(cuò)誤消息,此情況罕見。一旦服務(wù)器收到客戶端的交易數(shù)據(jù),它將繼續(xù)將其記錄在數(shù)據(jù)庫(kù)中,并向客戶端提供操作狀態(tài)的反饋。如果上傳的數(shù)據(jù)包已存在于數(shù)據(jù)庫(kù)中,則服務(wù)器將適時(shí)地通知客戶端該情況。3.5系統(tǒng)可靠性設(shè)計(jì)前置接入服務(wù)任何情況下,接入服務(wù)器監(jiān)測(cè)到客戶端的中斷異常,立即撤銷與該客戶端的所有業(yè)務(wù)鏈接,同時(shí)強(qiáng)制退出該客戶端的登陸狀態(tài),客戶端下次登陸時(shí)需要重新獲得授權(quán)。業(yè)務(wù)鏈癱瘓解決方案:設(shè)置業(yè)務(wù)鏈內(nèi)業(yè)務(wù)量的上限,比如將業(yè)務(wù)量上限設(shè)置為10000/小時(shí),一旦超過(guò)這個(gè)上限,立即斷開客戶端與業(yè)務(wù)處理機(jī)的連接并告知客戶端盡快操作與業(yè)務(wù)應(yīng)用服務(wù)器的重連,規(guī)定時(shí)間內(nèi)沒(méi)有重連,取消業(yè)務(wù)鏈內(nèi)全部業(yè)務(wù)的授權(quán),并告知對(duì)應(yīng)的客戶端重連失敗??蛻舳酥鲃?dòng)發(fā)起業(yè)務(wù)請(qǐng)求后,由接入服務(wù)中轉(zhuǎn)將信息上傳給業(yè)務(wù)應(yīng)用服務(wù)器,服務(wù)器處理完畢后又將信息反饋給接入服務(wù);接入服務(wù)收到了服務(wù)器反饋的信息,可客戶端已斷開。這種情況要記錄在日志里,包括記錄失敗的信息及原因。3.6數(shù)據(jù)庫(kù)設(shè)計(jì)需要約定好客戶端的用戶和視頻相關(guān)屬性的數(shù)據(jù)傳輸結(jié)構(gòu),才能使服務(wù)器能夠與客戶端順利進(jìn)行信息交互。圖3-9對(duì)客戶端用戶的信息和用戶視頻點(diǎn)播記錄的數(shù)據(jù)形式做了基本規(guī)范,用戶信息表用于登錄注冊(cè)時(shí)客戶端和服務(wù)器按照設(shè)定的信息格式進(jìn)行互發(fā)以此進(jìn)行用戶信息的核驗(yàn)和新增,點(diǎn)播記錄表的信息格式則將視頻ID和用戶ID設(shè)定在一起以便對(duì)不同用戶ID下的視頻信息進(jìn)行管理,本身監(jiān)控設(shè)備錄制的視頻信息就有保密要求,這樣能提高數(shù)據(jù)的私密性和安全性。圖3-10設(shè)計(jì)的數(shù)據(jù)表是監(jiān)控回放模式功能的基礎(chǔ),規(guī)定視頻的數(shù)據(jù)表信息格式,在按時(shí)間或者車牌進(jìn)行搜索時(shí),服務(wù)器才能準(zhǔn)確地給出反饋信息呈現(xiàn)在設(shè)備端界面上,比如當(dāng)用戶雙擊想要播放某個(gè)視頻時(shí),系統(tǒng)按照該視頻對(duì)應(yīng)地?cái)?shù)據(jù)格式向服務(wù)器發(fā)送請(qǐng)求獲得正確的視頻播放地址以此播放用戶點(diǎn)擊的視頻。圖3-11對(duì)停車場(chǎng)顧客的車輛信息進(jìn)行了詳細(xì)的數(shù)據(jù)表結(jié)構(gòu)設(shè)計(jì),系統(tǒng)使用的是SQLite3輕型數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中只需定義INTEGER和TEXT兩種數(shù)據(jù)類型的信息,設(shè)計(jì)更簡(jiǎn)單和服務(wù)器的交互效率更高,同時(shí)還能正確保存車輛的所有信息。1:N1:N記錄ID用戶ID視頻ID播放時(shí)長(zhǎng)最后播放時(shí)間<pi>Number(6)Number(6)Number(6)Integer<M><M><M><M>Date&Time<M>主鍵<pi>主鍵<pi><M><pi>Number(6)Variablecharacters(10)Variablecharacters(6)Characters(1)Variablecharacters(100)用戶ID狀態(tài)備注用戶點(diǎn)播記錄客戶端用戶圖SEQ圖\*ARABIC3-9客戶端用戶賬戶和視頻點(diǎn)播信息表結(jié)構(gòu)數(shù)據(jù)設(shè)計(jì)分類ID分類ID頻道ID視頻ID分類名稱狀態(tài)視頻分類<pi>Number<fi>NumberNumber(4)Variablecharacters(20)Characters(1)<M>視頻分類明細(xì)明細(xì)ID<pi>Number(6)視頻ID<fi>Number(6)分類ID Number(6)主鍵<pi>主鍵<pi>1:N1:N頻道ID頻道名稱狀態(tài)視頻頻道<pi>Number(4)Variablecharacters(20)Characters(1)<M>1:N主鍵<pi>視頻ID頻道ID地區(qū)ID視頻名稱播放次數(shù)最新上線圖片地址圖片鏈接備注視頻信息<pi>Number<fi1>Number<fi2>NumberVariablecharacters(64)IntegerCharacters(1)Variablecharacters(64)Variablecharacters(64)Variablecharacters(100)<M>1:N主鍵<pi>視頻地區(qū)<pi>Number<fi>NumberVariablecharacters(20)Characters(1)1:N地區(qū)ID頻道ID地區(qū)名稱狀態(tài)<M>1:N主鍵<pi>視頻播放明細(xì)播放明細(xì)ID<pi>Number(6)視頻ID <fi>Number(6)播放時(shí)間 Date&Time用戶ID Number(6)主鍵<pi>圖3-10視頻各屬性庫(kù)表數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)表3-11車輛進(jìn)出場(chǎng)客戶信息表數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)序列字段名稱數(shù)據(jù)類型數(shù)據(jù)說(shuō)明是否主鍵1carIDINTEGER記錄ID,Number(4)是2userIDTEXT顧客名稱,Varichar(10)否3carInNumberTEXT車牌號(hào)碼,Char(10)否4caiInTimeTEXT入場(chǎng)時(shí)間,Date&Time否5carOutTimeTEXT出場(chǎng)時(shí)間,Date&Time否6carInImgPathTEXT入場(chǎng)車牌圖片保存地址否7carOutImgPathTEXT出場(chǎng)車牌圖片保存地址否8carPriceINTEGER停車金額,Number(4)否9carIncountINTEGER停車次數(shù),Number(4)否

4系統(tǒng)環(huán)境的配置與測(cè)試本章對(duì)系統(tǒng)運(yùn)行需要準(zhǔn)備的軟件或者框架環(huán)境進(jìn)行安裝配置并做必要測(cè)試。系統(tǒng)設(shè)計(jì)在常用的Windows系統(tǒng)下實(shí)現(xiàn)服務(wù)器端的功能,在移植性較高的Linux下配置客戶端,通過(guò)使用虛擬機(jī)如軟件VMwareWorkstationPro實(shí)現(xiàn)在同一臺(tái)電腦上的跨平臺(tái)操作。實(shí)現(xiàn)系統(tǒng)需要六個(gè)部分的搭建和配置:Ubuntu安裝和遠(yuǎn)程服務(wù)配置;Windows下VS的配置;Ubuntu下QT的配置;跨平臺(tái)開發(fā)的SQLite3數(shù)據(jù)庫(kù)配置;基于Ubuntu的OpenCV環(huán)境配置;EasyPR識(shí)別框架的植入;4.1Ubuntu16.04安裝下載完Ubuntu16.04后打開安裝程序,在安裝映像文件時(shí)選擇“稍后安裝操作系統(tǒng)”,網(wǎng)絡(luò)連接模式選擇NATREF_Ref28995\r\h[21]。(先配置后安裝可以提高安裝后的穩(wěn)定性)Ubuntu系統(tǒng)安裝完成后則進(jìn)行遠(yuǎn)程服務(wù)配置,這也是跨平臺(tái)開發(fā)的關(guān)鍵操作,且客戶端的運(yùn)行需要再root權(quán)限下操作,通過(guò)在終端輸入相應(yīng)命令保證在Ubuntu登錄時(shí)可以選擇用戶,如圖4-1所示圖4-1打開選擇登錄用戶的功能重啟系統(tǒng),用root賬戶登錄系統(tǒng),進(jìn)入桌面會(huì)彈出警告提示框:mesg:ttynamefailed,點(diǎn)擊“確定”即可終端上修改文件信息,命令:gedit/root/.profile,然后將“mesgn”修改為“tty-s&&mesgn”保存設(shè)置重啟系統(tǒng)root登錄然后安裝遠(yuǎn)程調(diào)試服務(wù)安裝命令:sudoapt-getinstallopenssh-serverg++gdbgdbserver默認(rèn)情況下安裝SSH后并未開啟服務(wù),root登錄不被允許,通過(guò)以下步驟解決:確認(rèn)SSH服務(wù)已安裝完成,定位到配置文件“/etc/ssh/sshd_config”使用終端命令修改文件,命令行:gedit/etc/ssh/sshd_config在如圖4-2位置加上“#”號(hào)進(jìn)行注釋然后換行進(jìn)行編寫:PermitRootLoginyes圖4-2開啟SSH服務(wù)在Ubuntu終端輸查看虛擬機(jī)的ip地址,命令行:ifconfig在Windows下CMD命令行查看主機(jī)的ip地址,命令行;ipconfig主機(jī)ip地址為,虛擬機(jī)ip地址為29,處在同一網(wǎng)段則說(shuō)明ip地址正確(主機(jī)和虛擬機(jī)都處在91網(wǎng)段)測(cè)試Windows系統(tǒng)的ping連接情況,保持虛擬機(jī)開機(jī)狀態(tài),在Windows系統(tǒng)進(jìn)行命令操作,命令行:ping29。測(cè)試結(jié)果:收到如圖4-3的回復(fù)則說(shuō)明Windows和Ubuntu兩個(gè)系統(tǒng)成功連通。圖4-3主機(jī)ping虛擬機(jī)測(cè)試結(jié)果測(cè)試Ubuntu系統(tǒng)的ping連接情況,保持虛擬機(jī)開機(jī)狀態(tài),在Ubuntu系統(tǒng)進(jìn)行命令操作,命令行:ping。測(cè)試結(jié)果:收到如圖4-4的回復(fù)則說(shuō)明Windows和Ubuntu兩個(gè)系統(tǒng)成功連通。圖4-4虛擬機(jī)ping主機(jī)測(cè)試結(jié)果4.2Windows下VS的配置安裝VisualStudio2019后首先需要配置好連接器才能編寫Linux程序。當(dāng)VS下載安裝完成后,保持Linux下虛擬主機(jī)的SSH服務(wù)開啟,依次點(diǎn)擊“工具—選項(xiàng)—跨平臺(tái)—連接管理器—添加—確定”,在彈出的頁(yè)面中按照?qǐng)D4-5要求填寫信息,Xshell安全終端通過(guò)22號(hào)默認(rèn)端口連接到Linux虛擬主機(jī)。圖4-5連接器的配置VS和Ubuntu的環(huán)境配置完成后,在VS下新建一個(gè)C++工程測(cè)試在Linux下的遠(yuǎn)程操作功能,測(cè)試代碼如下:#include<stdio.h>intmain(){printf("hellofromlinux1!\n");return0;}測(cè)試結(jié)果:如圖4-6所示,hello程序生成,控制臺(tái)輸出”hellofromlinux1!”,本系統(tǒng)已具備了跨平臺(tái)開發(fā)的能力。(注意:由于是跨平臺(tái)開發(fā),只能使用調(diào)試功能來(lái)運(yùn)行項(xiàng)目所以必須在代碼上相應(yīng)位置打上斷點(diǎn))圖4-6VS跨平臺(tái)運(yùn)行的測(cè)試結(jié)果4.3QT環(huán)境配置需要下載QT5.8以上的版本否則可能有兼容問(wèn)題。下載安裝完成后,打開Ubuntu終端依次輸入兩條命令,否則在QT里無(wú)法進(jìn)行編譯:命令行:sudoapt-getinstalllibqt4-dev命令行:sudoapt-getinstallbuild-essential4.4測(cè)試SQLite3的跨平臺(tái)配置SQLite3的安裝和配置注意VS需要2019版本,Ubuntu16.04版本。安裝完成后檢測(cè)SQLite3在VS+Linux跨平臺(tái)環(huán)境的配置情況,測(cè)試代碼如下:#include<stdio.h>#include<iostream>#include<sqlite3.h>usingnamespacestd;intmain(){ sqlite3*mydb; intres=sqlite3_open("test.db",&mydb); if(res!=SQLITE_OK) { perror("sqlite3_openerror"); } else { cout<<"sqlite3_opensuccess"<<endl; } return0;}測(cè)試結(jié)果:如圖4-7所示控制臺(tái)輸出”opensuccess”說(shuō)明SQLite3已配置成功,此時(shí)Ubuntu下生成一個(gè)test.db數(shù)據(jù)庫(kù),如圖4-8所示。圖4-7SQLite3跨平臺(tái)測(cè)試結(jié)果圖4-8生成的test數(shù)據(jù)庫(kù)

4.5基于Ubuntu的OpenCV環(huán)境配置下載OpenCV-3.4.2版本,解壓到Ubuntu后修改Ubuntu安裝源:Ubuntu系統(tǒng)設(shè)置中打開軟件和更新,選擇中國(guó)服務(wù)器下的阿里云鏡像源;注意:如果是在學(xué)校宿舍網(wǎng)絡(luò),首選清華大學(xué)鏡像源;終端輸入apt-getupdate進(jìn)行刷新本地依賴包,終端輸入apt-getupgrade進(jìn)行本地依賴包升級(jí),和阿里云鏡像源同步安裝opencv需要的依賴包[根據(jù)提示輸入y,回車]sudoapt-getinstallcmakegitlibgtk2.0-devpkg-configlibavcodec-devlibavformat-devlibswscale-devsudoapt-getinstallpython-devpython-numpylibtbb2libtbb-devlibjpeg-devlibpng-devlibtiff5-devlibdc1394-22-devsudoapt-getinstalllibavcodec-devlibavformat-devlibswscale-devlibv4l-devliblapacke-devsudoapt-getinstalllibxvidcore-devlibx264-devsudoapt-getinstalllibatlas-base-devgfortransudoapt-getinstallffmpeg每操作一條代碼后檢查最后一行,看到中文則說(shuō)明操作完成,即使沒(méi)有中文能夠看到數(shù)字和一些報(bào)錯(cuò)以及警告,出現(xiàn)警告和報(bào)錯(cuò)重復(fù)執(zhí)行該條命令。安裝cmake和cmakegui圖形界面,終端命令apt-getinstallcmake應(yīng)用程序里找到并運(yùn)行cmake創(chuàng)建opencv-3.4.2-build文件夾,打開opencv源碼文件,打開opencv編譯文件點(diǎn)擊Configure,等待進(jìn)度找到BUILD分組,下的最后一項(xiàng)BUILD_opencv_world,打鉤,再次點(diǎn)擊Configure,等待進(jìn)度。執(zhí)行完背景變白,并且檢查看到BUILD_opencv_world已經(jīng)有被勾選,也看到了執(zhí)行過(guò)程提示configuringdone表示結(jié)束,點(diǎn)擊Generate打開opencv-3.4.2-build,右鍵打開終端,執(zhí)行命令make-jx,“x”是數(shù)字表示使用多少條線程進(jìn)行編譯,取雙數(shù)最好。等待最前面的數(shù)字【100%】以后,執(zhí)行makeinstall修改/etc/ld.so.conf這個(gè)文件是linux系統(tǒng)加載.so目錄的文件。系統(tǒng)啟動(dòng)的時(shí)候會(huì)把這個(gè)文件下的.so文件讀取進(jìn)來(lái)在文件中加入include/usr/local/lib執(zhí)行l(wèi)dconfig命令讓其生效(必須執(zhí)行),重啟Ubuntu,實(shí)現(xiàn)開機(jī)自動(dòng)加載opencv環(huán)境4.6EasyPR識(shí)別框架的植入在Linux系統(tǒng)內(nèi)植入EasyPR需要使用Cmake編譯工具,并且保證更新到最新的Cmake,同時(shí)為了避免其他插件對(duì)Opencv的影響需要修改CMakeLists.txt文件:set(CMAKE_PREFIX_PATH${CMAKE_PREFIX_PATH}"/usr/local/opt/opencv3")。通過(guò)$./build命令一鍵編譯shell即可。將EasyPR源碼移植到QT下OpenCV內(nèi),如圖4-9所示。圖4-9EasyPR源碼移植工程內(nèi)結(jié)果SVM模型訓(xùn)練svm.7z解壓得到大量的訓(xùn)練數(shù)據(jù),在src文件中可以找到,訓(xùn)練結(jié)果如圖4-10所示圖4-10SVM向量機(jī)模型訓(xùn)練ANN模型訓(xùn)練從src/train/ann.7z中解壓得到字符圖片數(shù)據(jù)集,字符分別放進(jìn)按照類別名稱命名的文件中,比如resources/text/province_mapping,即可得到ANN模型:$./demoann--chars=path/to/chars--ann=save/to/ann.xml測(cè)試移植性測(cè)試結(jié)果如圖4-11所示,圖中./demorecognize-p*****星號(hào)部分表示測(cè)試圖片存放的絕對(duì)路徑(地址)圖4-11移植性測(cè)試結(jié)果調(diào)用函數(shù)封裝封裝和調(diào)用函數(shù)如下,注意頭文件添加#include<opencv2/opencv.hpp>:voidhomewin::on_pushButton_6_clicked(){Matcar_number;intresult=pr.plateRecognize(this->frame,plateVec);qDebug()<<"result="<<result;if(result==0){plate=plateVec.at(0);//carinfosaveplateMat=plate.getPlateMat();//carnumberinfocvtColor(plateMat,car_number,CV_BGR2RGB);cvtColor(car_number,car_number,CV_BGR2RGB); QImageq_image=QImage(car_number.data,car_number.cols,car_number.rows,QImage::Format_RGB888);ui->label_2->setPixmap(QPixmap::fromImage(q_image));ui->label_2->setScaledContents(true);imageflag(q_image);stringstr_car_num=plateVec[0].getPlateStr();QStringq_str=QString::fromLocal8Bit(str_car_num.c_str());ui->lineEdit->clear();ui->lineEdit->insert(q_str);}plateVec.clear();}voidhomewin::on_pushButton_clicked(){close();this->hsp->pauseThread();this->hsp->setFlag(2);this->hsp->resumeThread();homewin_out*out=newhomewin_out();out->show();}調(diào)用EasyPR測(cè)試ui內(nèi)識(shí)別結(jié)果測(cè)試結(jié)果:識(shí)別成功,如圖4-12所示圖4-12系統(tǒng)內(nèi)車牌識(shí)別測(cè)試結(jié)果

5系統(tǒng)總體功能實(shí)現(xiàn)本章對(duì)系統(tǒng)進(jìn)行分模塊功能測(cè)試并記錄測(cè)試結(jié)果,并展示最終實(shí)現(xiàn)的系統(tǒng)效果。本系統(tǒng)不涉及硬件設(shè)備,因此測(cè)試環(huán)節(jié)所有需要通過(guò)攝像頭錄入的視頻和圖片均來(lái)自生活中的素材,通過(guò)OpenCV中的工具庫(kù)直接導(dǎo)入進(jìn)系統(tǒng),封裝的調(diào)用函數(shù)可以參考5.1.1開機(jī)動(dòng)畫展示部分。5.1系統(tǒng)功能測(cè)試5.1.1開機(jī)動(dòng)畫展示利用QT中的各鐘控件類可以直接封裝界面,這里直接創(chuàng)建指針對(duì)象進(jìn)行調(diào)用MainWindow*w=newMainWindow(),然后利用OpenCV中的庫(kù)VideoCapture工具類直接調(diào)用mp4文件播放,實(shí)現(xiàn)開機(jī)動(dòng)畫。主要代碼如下:voidbeginsp::beginsp1(){Matframe;VideoCapturecap("./image/kaijisp.mp4");while(cap.read(frame)){imshow("frame",frame);waitKey(40);}destroyAllWindows();MainWindow*w=newMainWindow();w->show();}測(cè)試結(jié)果:通過(guò)代碼調(diào)試,開機(jī)動(dòng)畫可以展示,效果如圖5-1所示圖5-1開機(jī)動(dòng)畫效果5.1.2系統(tǒng)設(shè)置開機(jī)動(dòng)畫結(jié)束后自動(dòng)跳轉(zhuǎn)到系統(tǒng)設(shè)置界面,該界面需要通過(guò)socket協(xié)議的設(shè)置與服務(wù)器建立連接,這也是跨平臺(tái)功能的需求,客戶端通過(guò)socket協(xié)議與服務(wù)器建立連接后服務(wù)器端能夠進(jìn)行統(tǒng)一的監(jiān)測(cè)和管理。連接方法:如表5-2所示表5-2socketconnect函數(shù)調(diào)用形式函數(shù)功能this->sc=socketconnect::getInstance();與遠(yuǎn)程主機(jī)建立連接,主機(jī)由IP地址和端口號(hào)指定。getInstance函數(shù)內(nèi)封裝有ip地址以及端口號(hào)信息readthread*readthread::Readthread=nullptr;readthread*readthread::getINstance(){if(readthread::Readthread==nullptr){readthread::Readthread=newreadthread();}returnreadthread::Readthread;}系統(tǒng)設(shè)置的界面ip和端口兩個(gè)編輯框是可以進(jìn)行直接編輯輸入信息的,圖片和視頻的保存位置編輯框只能進(jìn)行路徑選擇,實(shí)現(xiàn)代碼如下:MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);ui->lineEdit_3->setEnabled(false);ui->lineEdit_4->setEnabled(false);this->sc=socketconnect::getInstance();this->rt=readthread::getINstance();this->wt=writethread::getINstance();}voidMainWindow::on_pushButton_3_clicked(){selectedDir3=QFileDialog::getExistingDirectory(this,"選擇一個(gè)目錄","/",QFileDialog::ShowDirsOnly);if(!selectedDir3.isEmpty()){selectedDir3=selectedDir3.replace(QRegExp("\\"),"/");ui->lineEdit_3->setText(selectedDir3);}}voidMainWindow::on_pushButton_4_clicked()/*代碼邏輯同上,實(shí)現(xiàn)視頻保存路徑的設(shè)置*/測(cè)試系統(tǒng)設(shè)置界面功能性實(shí)現(xiàn)情況,點(diǎn)擊“確定”按鈕后連接成功會(huì)有提示框,失敗編輯框內(nèi)信息會(huì)清空。運(yùn)行以下代碼:voidMainWindow::on_pushButton_clicked(){umask(0);charbuf[100]={0};QStringtext1=ui->lineEdit->text();QStringtext2=ui->lineEdit_2->text();QStringtext3=ui->lineEdit_3->text();QStringtext4=ui->lineEdit_4->text();QStringtext5=ui->lineEdit_5->text();tp=text3;sp=text4;intwfd=open("/root/xcjly/1.txt",O_CREAT|O_WRONLY,0777);memcpy(buf,text1.toStdString().c_str(),strlen(text1.toStdString().c_str()));if(wfd<0){perror("openerror");}else{write(wfd,buf,strlen(text1.toStdString().c_str()));QByteArraydata=text1.toLatin1();//cout<<"mainwindowtext2="<<text2.toInt()<<endl;this->sc->CreatConnect(text2.toInt(),data.data());this->rt->setSocketfd(this->sc->getSocketfd());this->wt->setsocketfd(this->sc->getSocketfd());this->rt->start();this->wt->start();QMessageBox::about(this,"消息提示","系統(tǒng)設(shè)置成功");close();loginwin*w=newloginwin();w->show();}測(cè)試結(jié)果:如圖5-3所示,系統(tǒng)設(shè)置完成,客戶端與服務(wù)器連接。圖5-3系統(tǒng)設(shè)置測(cè)試結(jié)果5.1.3系統(tǒng)主界面(入場(chǎng)模式)EasyPR植入后車牌識(shí)別功能已經(jīng)可以正常實(shí)現(xiàn),入場(chǎng)模式還需要顯示入場(chǎng)的時(shí)間以及每次進(jìn)入車輛入場(chǎng)界面需要從數(shù)據(jù)庫(kù)中拉取本日車輛入場(chǎng)的信息顯示在界面的信息表上。時(shí)間顯示模塊QT中有自帶的拉取系統(tǒng)時(shí)間的庫(kù)函數(shù),調(diào)用函數(shù)封裝如下:voidhomewin::time(){QTimer*timer=newQTimer(this);timer->start(1000);connect(timer,SIGNAL(timeout()),this,SLOT(timeUpdate()));//連接信號(hào)槽}時(shí)間調(diào)用函數(shù)封裝完畢,直接在窗口實(shí)現(xiàn)函數(shù)域內(nèi)的imageflag函數(shù)中創(chuàng)建對(duì)象調(diào)用time函數(shù)即可實(shí)現(xiàn)時(shí)間的顯示,代碼如下:voidhomewin::imageflag(QImageflagimage){QDateTimedateTime(QDateTime::currentDateTime());//ip.toStdString().c_str()QStringtime=dateTime.toString("yyyy-MM-ddhh:mm:ss");QStringtime1=dateTime.toString("yyyy-MM-dd");MainWindow*win=newMainWindow();QStringip=win->setip();cout<<"ip="<<ip.toStdString().c_str()<<endl;QStringa=QString("%2/%1.jpg").arg(time).arg(tp.toStdString().c_str());flagimage.save(a,"jpg",100);ui->lineEdit_2->setText(time);cout<<"ui->lineEdit_2->text().toStdString().c_str()="<<ui->lineEdit_2->text().toStdString().c_str()<<endl;this->sf=newSplitFileThread((char*)a.toStdString().c_str());QObject::connect(this->sf,SIGNAL(Send2Widget(queue<FILEINFO>,int)),this,SLOT(SplitFileThread_done(queue<FILEINFO>,int)));this->sf->start();QObject::connect(this->rt,SIGNAL(Send2UIhomewin(bool)),this,SLOT(homewinbool(bool)));}時(shí)間更新部分代碼:voidhomewin::timeUpdate(){QDateTimedate=QDateTime::currentDateTime();ui->label_11->setText(tr("%1").arg(date.toString("yyyy-MM-ddhh:mm:ss")));}測(cè)試結(jié)果:如圖5-4所示,時(shí)間顯示功能正常,且能進(jìn)行時(shí)間按秒更新,如圖5-5所示。圖5-4時(shí)間顯示模塊測(cè)試結(jié)果 圖5-5時(shí)間更新功能測(cè)試數(shù)據(jù)表顯示模塊封裝一個(gè)tabel函數(shù),表頭設(shè)置信息:序號(hào)、車牌號(hào)碼、時(shí)間、位置,這里拉取4條最近信息進(jìn)行測(cè)試,主要代碼如下:voidhomewin::table1(){QTableWidgetItem*item0;QTableWidgetItem*item1;QList<QTableWidgetItem*>integerList;QList<QTableWidgetItem*>integerList1;ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);ui->tableWidget->setColumnCount(4);for(inti=0;i<4;i++){item0=newQTableWidgetItem;integerList.insert(i,item0);}//設(shè)置水平表頭integerList[0]->setText("序號(hào)");integerList[1]->setText("車牌號(hào)碼");integerList[2]->setText("時(shí)間");integerList[3]->setText("位置");for(inti=0;i<4;i++){ui->tableWidget->setHorizontalHeaderItem(i,integerList[i]);}ui->tableWidget->setRowCount(4);for(inti=0;i<16;i++){item1=newQTableWidgetItem;integerList1.insert(i,item1);}QStringaa1=QString("%1").arg(a.carID);QStringbb1=QString(a.carNumber);QStringcc1=QString(a.inputTime);QStringdd1=QString(a.inputPosition);integerList1[9]->setText(dd2.toStdString().c_str());integerList1[10]->setText(dd3.toStdString().c_str());QStringaa=QString("%1").arg(a.carnumber);QStringbb=QString();ui->label_9->setText(aa.toStdString().c_str());ui->label_10->setText(bb.toStdString().c_str());QStringtp;QStringsp;for(inti=0;i<4;i++){ui->tableWidget->setItem(i,0,integerList1[i]);ui->tableWidget->setItem(i,1,integerList1[i+4]);ui->tableWidget->setItem(i,2,integerList1[i+8]);ui->tableWidget->setItem(i,3,integerList1[i+12]);}}測(cè)試結(jié)果:數(shù)據(jù)庫(kù)中表更新成功,如圖5-6所示。圖5-6數(shù)據(jù)表顯示測(cè)試結(jié)果5.1.4出場(chǎng)車牌識(shí)別界面出場(chǎng)識(shí)別界面對(duì)比入場(chǎng)識(shí)別界面,除了需要向數(shù)據(jù)庫(kù)調(diào)用該車輛的入場(chǎng)時(shí)間,還要計(jì)算停放時(shí)間和金額,其他功能完全一樣,主要實(shí)現(xiàn)代碼如下:voidhomewin_out::imageflag(QImageflagimage){QDateTimedateTime(QDateTime::currentDateTime());QStringtime=dateTime.toString("yyyy-MM-ddhh:mm:ss");QStringtime1=dateTime.toString("yyyy-MM-dd");MainWindow*win=newMainWindow();QStringip=win->setip();cout<<"ip="<<ip.toStdString().c_str()<<endl;QStringa=QString("%2/%1.jpg").arg(time).arg(tp.toStdString().c_str());flagimage.save(a,"jpg",100);ui->label_14->setText(time);cout<<"ui->lineEdit_2->text().toStdString().c_str()="<<ui->label_14->text().toStdString().c_str()<<endl;QObject::connect(this->sf,SIGNAL(Send2Widget(queue<CHARA>,int)),this,SLOT(SplitFileThread_done(queue<CHARA>,int)));}測(cè)試結(jié)果:如圖5-7所示,入場(chǎng)時(shí)間顯示成功,計(jì)時(shí)和計(jì)費(fèi)功能正常。圖5-7車輛出場(chǎng)識(shí)別界面主要模塊功能測(cè)試結(jié)果5.1.5車輛信息查詢界面頁(yè)面UI的表格制表方法邏輯和入場(chǎng)識(shí)別界面的數(shù)據(jù)表相同,下面給出制表格式的表頭信息: integerList[0]->setText("序號(hào)");integerList[1]->setText("車牌消息");integerList[2]->setText("入場(chǎng)時(shí)間");integerList[3]->setText("出場(chǎng)時(shí)間");integerList[4]->setText("入場(chǎng)時(shí)間");integerList[5]->setText("出場(chǎng)圖片");integerList[6]->setText("停車金額");車輛信息查詢界面可以通過(guò)“車牌號(hào)碼”、“入場(chǎng)時(shí)間”、“出場(chǎng)時(shí)間”中的任意一種或多種信息對(duì)車輛進(jìn)出場(chǎng)的記錄進(jìn)行查詢,點(diǎn)擊“查詢”按鈕即可進(jìn)行查詢,主要代碼邏輯如下:voidmewabout::on_pushButton_clicked(){QStringtext1=ui->lineEdit->text();QStringtext2=ui->lineEdit_2->text();QStringtext3=ui->lineEdit_3->text();if(strcmp(text1.toStdString().c_str(),"")==0&&strcmp(text2.toStdString().c_str(),"")==0&&strcmp(text3.toStdString().c_str(),"")==0){QMessageBox::information(nullptr,"信息框","不可以為空");}else{qDebug()<<"number"<<text1.toLatin1();qDebug()<<"rtime"<<text2.toLatin1();qDebug()<<"ctime"<<text3.toLatin1();memcpy(back.carNumber,text1.toStdString().c_str(),sizeof(back.carNumber));memcpy(back.inputTime,text2.toLatin1(),sizeof(back.inputTime));memcpy(back.OutTime,text3.toLatin1(),sizeof(back.OutTime));this->head.bussinesstype=11;this->head.bussinesslenth=sizeof(this->back);qDebug()<<"back.inputTime"<<back.carNumber;memset(buf,0,sizeof(buf));memcpy(this->buf,&(this->head),sizeof(this->head)); memcpy(this->buf+sizeof(this->head),&(this->back),sizeof(this->back)); this->wt->setData(&(this->buf),sizeof(this->head)+sizeof(this->back));}測(cè)試結(jié)果:這里通過(guò)“車牌號(hào)碼”進(jìn)行測(cè)試,在車牌號(hào)輸入編輯框處輸入“296”,正常情況下能夠顯示出所有包含“296”車牌車輛的進(jìn)出場(chǎng)信息,測(cè)試結(jié)果如圖5-8所示。圖5-8車輛信息查詢功能測(cè)試結(jié)果5.1.6停車場(chǎng)內(nèi)部管理內(nèi)部管理主界面內(nèi)部管理可以手動(dòng)/自動(dòng)錄制停車場(chǎng)內(nèi)部視頻,同時(shí)可以進(jìn)行特征圖片抓拍,抓拍的功能邏輯也可以在車輛入場(chǎng)識(shí)別時(shí)抓拍使用。抓拍的封裝調(diào)用函數(shù)代碼:Finterior_manage::Finterior_manage(QWidget*parent):QWidget(parent),voidFinterior_manage::on_pushButton_2_clicked(){QDateTimedateTime(QDateTime::currentDateTime());QStringtime=dateTime.toString("yyyy-MM-ddhh:mm:ss");MainWindow*win=newMainWindow();QStringip=win->setip();QStringa=QString("%2/%1.jpg").arg(time).arg(ip.toStdString().c_str());QImageq_image=QImage(frame.data,frame.cols,frame.rows,QImage::Format_RGB888);q_image.save(a,"jpg",100);QMessageBox::information(nullptr,"信息框","抓拍成功");}手動(dòng)和自動(dòng)錄制都是相同的實(shí)現(xiàn)邏輯,下面是自動(dòng)錄制的函數(shù)封裝:voidFinterior_manage::on_radioButton_clicked(){if(NUME==0){QMessageBox::information(nullptr,"信息框","開始自動(dòng)錄制");this->hsp->setIsRecord(true);NUME=NUME+1;}elseif(NUME==1){QMessageBox::information(nullptr,"信息框","保存成功");this->hsp->setIsRecord(false);NUME=NUME-1;}}視頻播放界面播放功能主要從OpenCV庫(kù)中調(diào)用,還需要用到QT相關(guān)函數(shù),頭文件和預(yù)編譯代碼保證功能可以正常使用:#include"videoplaythread.h"#include<QtCore/qbytearray.h>#include<QtCore/qmetatype.h>#if!defined(Q_MOC_OUTPUT_REVISION)#error"Theheaderfile'videoplaythread.h'doesn'tinclude<QObject>."下面函數(shù)封裝可以對(duì)視頻保存的節(jié)點(diǎn)和數(shù)據(jù)進(jìn)行保存,其中RTSP流媒體協(xié)議先進(jìn)行連接創(chuàng)建,代碼實(shí)現(xiàn)如下:sfd=socket(AF_INET,SOCK_STREAM,0);bind(sfd,(structsockaddr*)&addr,sizeof(addr));listen(sfd,10);clifd=accept(sfd,(structsockaddr*)&addr,&addrlen);voidvideoplaythread::qt_static_metacall(QObject*_o,QMetaObject::Call_c,int_id,void**_a){if(_c==QMetaObject::InvokeMetaMethod){videoplaythread*_t=static_cast<videoplaythread*>(_o);Q_UNUSED(_t)switch(_id){case0:_t->dataSend2UI((*reinterpret_cast<int(*)>(_a[1])),(*reinterpret_cast<Mat(*)>(_a[2])));break;default:;}}elseif(_c==QMetaObject::IndexOfMethod){int*result=reinterpret_cast<int*>(_a[0]);{typedefvoid(videoplaythread::*_t)(int,Mat);if(*reinterpret_cast<_t*>(_a[1])==static_cast<_t>(&videoplaythread::dataSend2UI)){*result=0;return;}}}}測(cè)試結(jié)果:如圖5-9所示,視頻播放功能正常。圖5-9視頻播放功能測(cè)試結(jié)果5.2系統(tǒng)實(shí)現(xiàn)效果5.2.1服務(wù)器實(shí)現(xiàn)效果本系統(tǒng)實(shí)現(xiàn)的服務(wù)器的最終效果是能夠接收并處理客戶端的各項(xiàng)業(yè)務(wù)要求,下面以客戶端的登錄業(yè)務(wù)為引展現(xiàn)服務(wù)器的實(shí)現(xiàn)效果??蛻舳溯斎胭~號(hào)密碼后,業(yè)務(wù)類型為登錄作為協(xié)議頭,用戶輸入的賬號(hào)密碼作為協(xié)議體,發(fā)送給服務(wù)器。實(shí)現(xiàn)效果如圖5-10所示圖5-10服務(wù)器接收數(shù)據(jù)包 (2)前置服務(wù)器判斷出協(xié)議頭為登錄,將協(xié)議體存入共享內(nèi)存后通知后置服務(wù)器。實(shí)現(xiàn)效果如圖5-11所示圖5-11前置服務(wù)器處理數(shù)據(jù)包(3)后置服務(wù)器接收到消息之后在共享內(nèi)存中讀到協(xié)議體的內(nèi)容,也就是賬號(hào)密碼,再連接數(shù)據(jù)庫(kù),使用數(shù)據(jù)庫(kù)語(yǔ)言來(lái)做數(shù)據(jù)處理,這里即核驗(yàn)賬號(hào)密碼。實(shí)現(xiàn)效果如圖5-12所示圖5-12后置服務(wù)器處理數(shù)據(jù)包最后登錄為頭,處理完的數(shù)據(jù)為體,發(fā)送給前置服務(wù)器,前置再發(fā)送給客戶端。實(shí)現(xiàn)效果如圖5-13所示圖5-13服務(wù)器反饋數(shù)據(jù)包傳回客戶端總結(jié):服務(wù)器對(duì)客戶端的管理都基于此流程,客戶端的請(qǐng)求首先經(jīng)過(guò)自定義協(xié)議的形式發(fā)送給前置服

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論