你不知道的車(chē)牌識(shí)別系統(tǒng)
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
有小伙伴后臺(tái)和小白說(shuō),能不能推薦幾個(gè)適合入門(mén)的開(kāi)源視覺(jué)項(xiàng)目,因?yàn)楦鶕?jù)實(shí)際項(xiàng)目和代碼學(xué)起來(lái)相對(duì)來(lái)說(shuō)比較快。小白收集了一些比較簡(jiǎn)單的開(kāi)源的項(xiàng)目,會(huì)陸陸續(xù)續(xù)的分享給大家,文末有源碼地址。
今天首先帶來(lái)的是一個(gè)車(chē)牌識(shí)別系統(tǒng)EasyPR。為什么推薦它呢,有兩個(gè)原因:1,車(chē)牌識(shí)別已經(jīng)做的比較成熟了,相對(duì)來(lái)說(shuō)是一個(gè)比較簡(jiǎn)單的項(xiàng)目了。2,這個(gè)項(xiàng)目是國(guó)內(nèi)團(tuán)隊(duì)寫(xiě)的,里面的說(shuō)明文檔全部都是中文,這對(duì)很多看英文頭疼的小伙伴來(lái)說(shuō)是再好不過(guò)的了。
項(xiàng) 目 簡(jiǎn) 介
EasyPR是一個(gè)中文的開(kāi)源車(chē)牌識(shí)別系統(tǒng),其目標(biāo)是成為一個(gè)簡(jiǎn)單、高效、準(zhǔn)確的車(chē)牌識(shí)別引擎。相比于其他的車(chē)牌識(shí)別系統(tǒng),EasyPR有如下特點(diǎn):
它基于openCV這個(gè)開(kāi)源庫(kù)。這意味著你可以獲取全部源代碼,并且移植到j(luò)ava等平臺(tái)。
它能夠識(shí)別中文。例如車(chē)牌為蘇EUK722的圖片,它可以準(zhǔn)確地輸出std:string類(lèi)型的"蘇EUK722"的結(jié)果。
它的識(shí)別率較高。圖片清晰情況下,車(chē)牌檢測(cè)與字符識(shí)別可以達(dá)80%以上的精度。
項(xiàng) 目 效 果
假設(shè)我們有如下的原始圖片,需要識(shí)別出中間的車(chē)牌字符與顏色:

經(jīng)過(guò)EasyPR的第一步處理車(chē)牌檢測(cè)(PlateDetect)以后,我們獲得了原始圖片中僅包含車(chē)牌的圖塊:

接著,我們對(duì)圖塊進(jìn)行OCR過(guò)程,在EasyPR中,叫做字符識(shí)別(CharsRecognize)。我們得到了一個(gè)包含車(chē)牌顏色與字符的字符串:“藍(lán)牌:蘇EUK722”
這個(gè)識(shí)別是不是很神奇。什么?小伙伴覺(jué)得還不過(guò)癮,講解的還不夠詳細(xì),那接下來(lái)再接一個(gè)示例好了,這回有圖有程序。
代 碼 示 例
EasyPR的調(diào)用非常簡(jiǎn)單,下面是一段示例代碼:
CPlateRecognizepr;
pr.setResultShow(false);
pr.setDetectType(PR_DETECT_CMSER);
vector<CPlate>plateVec;
Matsrc = imread(filepath);
int result =pr.plateRecognize(src, plateVec);
我們首先創(chuàng)建一個(gè)CPlateRecognize的對(duì)象pr,接著設(shè)置pr的屬性。
pr.setResultShow(false);這句話(huà)設(shè)置EasyPR是否打開(kāi)結(jié)果展示窗口,如下圖。設(shè)置為true就是打開(kāi),否則就是關(guān)閉。在需要觀看定位結(jié)果時(shí),建議打開(kāi),快速運(yùn)行時(shí)關(guān)閉。

pr.setDetectType(PR_DETECT_CMSER);這句話(huà)設(shè)置EasyPR采用的車(chē)牌定位算法。CMER代表文字定位方法,SOBEL和COLOR分別代表邊緣和顏色定位方法。可以通過(guò)"|"符號(hào)結(jié)合。
pr.setDetectType(PR_DETECT_COLOR| PR_DETECT_SOBEL);除此之外,還可以有一些其他的屬性值設(shè)置:
pr.setLifemode(true);這句話(huà)設(shè)置開(kāi)啟生活模式,這個(gè)屬性在定位方法為SOBEL時(shí)可以發(fā)揮作用,能增大搜索范圍,提高魯棒性。
pr.setMaxPlates(4);這句話(huà)設(shè)置EasyPR最多查找多少個(gè)車(chē)牌。當(dāng)一副圖中有大于n個(gè)車(chē)牌時(shí),EasyPR最終只會(huì)輸出可能性最高的n個(gè)。
下面來(lái)看pr的方法。plateRecognize()這個(gè)方法有兩個(gè)參數(shù),第一個(gè)代表輸入圖像,第二個(gè)代表輸出的車(chē)牌CPlate集合。
vector<CPlate>plateVec;
Matsrc = imread(filepath);
int result =pr.plateRecognize(src, plateVec);當(dāng)返回結(jié)果result為0時(shí),代表識(shí)別成功,否則失敗。CPlate類(lèi)包含了車(chē)牌的各種信息,其中重要的如下:
CPlateplate = plateVec.at(i);
MatplateMat = plate.getPlateMat();
RotatedRectrrect = plate.getPlatePos();
stringlicense = plate.getPlateStr();plateMat代表車(chē)牌圖像,rrect代表車(chē)牌的可旋轉(zhuǎn)矩形位置,license
代表車(chē)牌字符串,例如“藍(lán)牌:蘇EUK722”。
這里說(shuō)下如何去閱讀如下圖的識(shí)別結(jié)果。

第1行代表的是圖片的文件名。
第2行代表GroundTruth車(chē)牌,用后綴(g)表示。
第3行代表EasyPR檢測(cè)車(chē)牌,用后綴(d)表示。兩者形成一個(gè)配對(duì)
第4行代表兩者的字符差距。下面同上。本圖片中有3個(gè)車(chē)牌,所有共有三個(gè)配對(duì)。
最后的Recall等指標(biāo)代表的是整幅圖片的定位評(píng)價(jià),考慮了三個(gè)配對(duì)的結(jié)果。有時(shí)檢測(cè)車(chē)牌的部分會(huì)用“無(wú)車(chē)牌”與“No string”替代。“無(wú)車(chē)牌”代表“定位不成功”,“No string”代表“定位成功但字符分割失敗”。
如果小伙伴想了解更多的關(guān)于項(xiàng)目的內(nèi)容,可以通過(guò)下載代碼,閱讀里面的說(shuō)明文檔,也可以在自己的電腦上跑一下該程序。
源碼地址:https://gitee.com/easypr/EasyPR
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱(chēng)+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

