摘 要:本課題研究?jī)?nèi)容是基于傳統(tǒng)方法實(shí)現(xiàn)對(duì)車(chē)牌號(hào)碼的識(shí)別,運(yùn)用了計(jì)算機(jī)視覺(jué)等方面的知識(shí)??傮w設(shè)計(jì)方案包括圖像獲取、圖像預(yù)處理、目標(biāo)區(qū)域檢測(cè)、目標(biāo)區(qū)域分割、目標(biāo)區(qū)域處理、字符分割以及字符識(shí)別及輸出。Python 因?yàn)樗鬃x、易維護(hù)的特點(diǎn),近年來(lái)迅速成為被大量用戶所廣泛應(yīng)用和受歡迎的編程開(kāi)發(fā)語(yǔ)言。所以此次選擇使用 Python 來(lái)完成本次課題的實(shí)現(xiàn)。Open CV 應(yīng)用范圍廣泛,它還可以提供 Python、Matlab 等語(yǔ)言接口來(lái)實(shí)現(xiàn)圖像處理和計(jì)算機(jī)視覺(jué)中的許多通用算法。本課題設(shè)計(jì)主要結(jié)構(gòu)采用 Python+Open CV 來(lái)實(shí)現(xiàn)完成。
關(guān)鍵詞:車(chē)牌識(shí)別;Python;Open CV
汽車(chē)的出現(xiàn)改變了步行和騎自行車(chē)的時(shí)代,更加便于人們?nèi)粘3鲂?,增加了人們之間的良好溝通。汽車(chē)為我們的旅行提供了便利,也給城市的交通造成了壓力。來(lái)自城市的車(chē)輛進(jìn)行有效的實(shí)時(shí)監(jiān)測(cè)和管理,能提高智能運(yùn)輸?shù)男?,有效地減少了人工的操作。這不僅節(jié)省費(fèi)用,而且在一定程度上還能杜絕工作人員亂收費(fèi),違規(guī)操作的問(wèn)題。因?yàn)檫@諸多原因,社會(huì)整體對(duì)實(shí)現(xiàn)車(chē)牌識(shí)別技術(shù)寄予了厚望。在這項(xiàng)技術(shù)中,國(guó)外的科技人員要比國(guó)內(nèi)提前一步開(kāi)始進(jìn)行研究,其主要方法便是運(yùn)用圖像處理技術(shù)將其運(yùn)用到實(shí)際應(yīng)用之中,牌照識(shí)別技術(shù)研究沒(méi)有產(chǎn)生完整的系統(tǒng)。但基于當(dāng)時(shí)的科技水平,使用簡(jiǎn)單的圖像處理技術(shù),以此用于實(shí)際生活中的一些具體問(wèn)題,如果想要得到最終人們想要的結(jié)果,則需要工作人員的手動(dòng)參與。20 世紀(jì) 90 年代以后,我國(guó)對(duì)車(chē)牌自動(dòng)識(shí)別系統(tǒng)的研究開(kāi)始了。一些高端院校與機(jī)構(gòu)同樣對(duì)此類(lèi)技術(shù)進(jìn)行了深入的探索,研究期間,需要克服的環(huán)境干擾問(wèn)題極為繁多。截止至今日,國(guó)內(nèi)對(duì)于車(chē)牌自動(dòng)識(shí)別系統(tǒng)技術(shù)的研究已經(jīng)取得了較為巨大的進(jìn)步,并且其中較為成熟的產(chǎn)品已經(jīng)投入使用。本文的主題和內(nèi)容是使用 Python+ Open CV 技術(shù)來(lái)提高車(chē)牌識(shí)別效率。
1研究框架
本課題研究?jī)?nèi)容是基于傳統(tǒng)方法實(shí)現(xiàn)對(duì)車(chē)牌號(hào)碼的識(shí)別,運(yùn)用數(shù)字圖像處理、計(jì)算機(jī)視覺(jué)方面的知識(shí)??傮w設(shè)計(jì)方案包括圖像獲取、圖像預(yù)處理、目標(biāo)區(qū)域檢測(cè)、目標(biāo)區(qū)域分割、目標(biāo)區(qū)域處理、字符分割以及字符識(shí)別及輸出。如圖 1 所示為整體設(shè)計(jì)思路框圖。
2圖像讀取
使用 Python 對(duì)圖像進(jìn)行讀取有兩種方式。
第一種是利用 Open CV 提供的 cv.imread()函數(shù)和 cv.imshow()函數(shù),在這其中,cv.imread()函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)為讀取圖像資源的路徑,若圖像資源與項(xiàng)目在同一目錄下則可直接輸入圖像資源的名稱(chēng)加后綴名,若圖像資源與項(xiàng)目不在同一目錄下,則需要使用絕對(duì)路徑加圖像名稱(chēng)與后綴名。第二個(gè)參數(shù)為圖像資源的讀取方式,可用阿拉伯?dāng)?shù)字 0,1,2 表示,分別表示加載黑白圖像,加載彩色圖像,加載含阿爾法通道信息圖像。cv.imshow()函數(shù)則用來(lái)顯示加載的圖像資源,此函數(shù)也有兩個(gè)參數(shù),顯示圖像的窗體名稱(chēng)及顯示的圖片變量名稱(chēng)分別為其第一和第二個(gè)參數(shù)。
第二種方式是使用 cv.imdecode()函數(shù)來(lái)加載圖像資源。cv.imread()函數(shù)要求圖像資源名稱(chēng)不能包含中文字符,而 cv.imdecode()函數(shù)可以選擇編碼格式,對(duì)中文命名的圖像資源也可加載顯示。
通過(guò) Numpy 數(shù)組操作來(lái)獲取圖像的各個(gè)屬性。在本次課程設(shè)計(jì)中,需要獲得加載的圖像資源的寬度與高度,通過(guò) Numpy 提供的 shape 方法來(lái)返回圖像資源的高度、寬度與通道數(shù)的數(shù)組。
3圖片預(yù)處理
3.1色彩空間轉(zhuǎn)換
從網(wǎng)絡(luò)上下載的圖像資源與手機(jī)拍攝的圖像資源,為避免因圖像資源大小格式均不一致而導(dǎo)致出現(xiàn)錯(cuò)誤。所以要針對(duì)所取得的圖像資源進(jìn)行相應(yīng)的處理。將圖片保存為 jpg 或 png 格式,將圖像資源壓縮成 1000*750 像素,以便后續(xù)對(duì)圖像資源進(jìn)行相關(guān)操作。
將 RGB 色彩圖像使用 cv.cvtColor()函數(shù)對(duì)其進(jìn)行處理為 HSV 色彩飽和度圖像,其中,調(diào)整 HSV 各通道的顏色對(duì)應(yīng)的最大值與最小值來(lái)實(shí)現(xiàn)HSV 色彩飽和度圖像對(duì)圖像資源的色彩檢測(cè)。HSV 各通道的顏色對(duì)應(yīng)的最大值與最小值,如圖 3 所示。
我們通過(guò)輸入藍(lán)色對(duì)應(yīng)的各個(gè)通道的最大值與最小值,利用 cv.imRange()函數(shù)實(shí)現(xiàn)對(duì)圖像的色彩檢測(cè)。Cv.imrange()函數(shù)最重要的三個(gè)參數(shù)分別為要處理的圖像和最大值與最小值,可以使用變量和 array 數(shù)組來(lái)保存相應(yīng)的值。
3.2邊緣檢測(cè)與二值化處理
因?yàn)闊o(wú)法避免車(chē)輛的背景中不存在藍(lán)色的區(qū)域,只使用顏色檢測(cè)不能達(dá)到最好的效果。
面對(duì)這種情況,需要對(duì)顏色檢測(cè)后的圖像進(jìn)行邊緣檢測(cè),描繪出各個(gè)部分的邊緣情況,隨后根據(jù)現(xiàn)實(shí)情況的具體要求對(duì)處理后的圖像進(jìn)行二值化操作與形態(tài)學(xué)操作。首先要對(duì)圖像資源進(jìn)行高斯濾波去噪,然后通過(guò)多次形態(tài)學(xué)開(kāi)閉操作與腐蝕膨脹填充等操作找出車(chē)牌輪廓。
3.3外輪廓繪制與字符切割
通過(guò)上面的操作,已經(jīng)找到了車(chē)牌的輪廓,但車(chē)牌的輪廓并不規(guī)則,無(wú)法對(duì)其進(jìn)行操作。所以我們將已經(jīng)找到的車(chē)牌的輪廓外圍繪制了一個(gè)規(guī)則的矩形,這個(gè)規(guī)則的矩形與車(chē)牌最外側(cè)輪廓相切,這樣就對(duì)車(chē)牌成功進(jìn)行了粗定位。然后將繪制的矩形切割下來(lái)。
在對(duì)字符進(jìn)行切割之前,還需要做一些準(zhǔn)備工作。首先針對(duì)不同的圖像切割出來(lái)的外輪廓尺寸也均不相同。先將切割下來(lái)的車(chē)牌圖像統(tǒng)一尺寸為車(chē)牌標(biāo)準(zhǔn)尺寸 450*15 然后對(duì)車(chē)牌部分同樣進(jìn)行二值化處理與形態(tài)學(xué)操作,然后通過(guò)遍歷圖像像素值的方法獲取字符界限。從上向下遍歷每一列像素,如若像素值從 0 變成 255,此時(shí)表示顏色從黑色變?yōu)榘咨?,則判斷為字符上界,反之,如若像素值從 255 變?yōu)?0,此時(shí)表示顏色從白色變?yōu)楹谏?,則判斷為字符下界。然后使用同樣的方法,找出字符的左右界限,然后將每個(gè)字符分割出來(lái)。
4字符識(shí)別
4.1 安裝Tesseract-OCR
Tesseract-OCR 是一個(gè)免費(fèi)的圖片識(shí)別文字的軟件,可以通過(guò)具體網(wǎng)站下載并進(jìn)行安裝,隨后通過(guò)該軟件進(jìn)行下一步的相關(guān)實(shí)驗(yàn)。
4.2 字符識(shí)別
在 Python 中通過(guò) text = pytesseract.image_to_string(cropImg, lang="chi", config="-psm 10")調(diào)用 tesseract。其中 cropimg 是原圖片,lang 是我們之后自定義的語(yǔ)言,config 后面一定要跟 10 因?yàn)榇藚?shù)表示對(duì)單個(gè)字符進(jìn)行識(shí)別,默認(rèn)是對(duì)一行字符識(shí)別。
我們需要將所獲得的字符轉(zhuǎn)換為 tif 格式才能使用 Tesseract-OCR 進(jìn)行字符識(shí)別,具體的實(shí)現(xiàn)方法為:
if type(imgfile) == str and imgfile.endswith(('.bmp', 'gif', 'png', 'jpg')): with Image.open(imgfile)as im:
im.convert('RGB').save(imgfile[:-3] + 'tif')
利用 jTessBoxEditor 對(duì)多個(gè)字符圖片識(shí)別,將識(shí)別錯(cuò)誤的圖片改正。最后得到需要的文件放入文件夾即可。最后得到如圖 10 所示結(jié)果。
5 總結(jié)
本實(shí)驗(yàn)是利用 Python 語(yǔ)言實(shí)現(xiàn)車(chē)牌識(shí)別技術(shù)。實(shí)驗(yàn)的工作流程為獲取圖像、預(yù)處理圖像、檢測(cè)目標(biāo)區(qū)域、目標(biāo)區(qū)域分割、目標(biāo)區(qū)域處理、字符分割、字符識(shí)別等。在這一具體過(guò)程中,為實(shí)現(xiàn)目標(biāo)結(jié)果的正常生成,應(yīng)當(dāng)合理運(yùn)用了 PyCharm 軟件,才能夠較為準(zhǔn)確地識(shí)別車(chē)牌, 達(dá)到了題目要求和預(yù)期目的。因?yàn)?Python 語(yǔ)言的簡(jiǎn)潔性和通用性,使其開(kāi)發(fā)較為簡(jiǎn)單,而且很多嵌入式,如樹(shù)莓派等也都兼容,使其可以方便的進(jìn)行代碼移植,運(yùn)用實(shí)際的場(chǎng)景中。隨著軟件算法的深入研究和硬件設(shè)備的升級(jí)換代,車(chē)牌識(shí)別技術(shù)也將越來(lái)越成熟化和智能化。
參考文獻(xiàn)
[1] Joe Minichino Joseph Howse 著. OpenCV3 計(jì)算機(jī)視覺(jué) Python 語(yǔ)言實(shí)現(xiàn)[M]. 北京:機(jī)械工業(yè)出版社,2001.5
[2] 毛星云著. OpenCV3 編程入門(mén)[M]. 北京:電子工業(yè)出版社 2015.7
[3] 岡薩雷斯(美),伍茲(美)著 數(shù)字圖像處理[M] 北京:電子工業(yè)出版社 2011.6
[4] 斯蒂格(德)著 機(jī)器視覺(jué)算法與應(yīng)用[M] 北京:清華大學(xué)出版社 2008.12
[5] 布拉德斯基(美)著 學(xué)習(xí) OpenCV[M] 北京:清華大學(xué)出版社 2009.10
[6] 圖像處理與分析[M]. 科學(xué)出版社 , 崔屹編著, 2000
[7] 李曉莎,林森.基于 Python+OpenCV 的車(chē)牌識(shí)別技術(shù)的研究[J].數(shù)字技術(shù)與應(yīng)用,2019,37(06):95-97
作者簡(jiǎn)介:霍立志(1996),男,安徽淮北人,淮北師范大學(xué)信息學(xué)院2016級(jí)本科在讀,研究方向:通信工程