前言
車牌識別其實是個經典的機器視覺任務了,通過圖像處理技術檢測、定位、識別車牌上的字元,實現計算機對車牌的智能管理功能。如今在小區停車場、高速公路出入口、監控場所、自動收費站等地都有車牌識別系統的存在,車牌識別的研究也已逐步成熟。儘管該技術隨處可見了,但其實在精度和識別速度上還需要進一步提升,自己動手實現一個車牌識別系統有利於學習和理解圖像處理的先進技術。
車牌識別的演算法經過了多次版本迭代,檢測的效率和準確率有所提升,從最初的基於LBP和Haar特徵的車牌檢測,到後來逐步採用深度學習的方式如SSD、YOLO等演算法。車牌的識別部分也由字元匹配到深度神經網路,通過不斷驗證和測試,其檢測和識別效果和適用性都更加突出,支持的模型也更為豐富。
網上的車牌識別程序代碼很多,大部分都是採用深度學習的目標檢測演算法等識別單張圖片中的車牌,但幾乎沒有人將其開發成一個可以展示的完整軟體,即使有的也是比較簡單的界面。對此這裡給出博主設計的界面,不算精美但比較簡約風,功能也可以滿足單張圖片、批量圖片、視頻和攝像頭的識別檢測了,初始界面如下圖:

檢測車牌時的界面截圖(點擊圖片可放大)如下圖,也可開啟攝像頭或視頻檢測:

詳細的功能演示效果參見博主的B站視頻或下一節的動圖演示,覺得不錯的朋友敬請點贊、關注加收藏!系統UI界面的設計工作量較大,界面美化更需仔細雕琢,大家有任何建議或意見和可在下方評論交流。
1. 效果演示
首先還是用動圖先展示一下效果,系統主要實現的功能是對圖片、視頻和攝像頭畫面中的車牌進行檢測和識別,識別的結果可視化顯示在界面和圖像中,另外提供車牌識別歷史記錄和回看功能,演示效果如下。
(一)選擇單張 / 批量車牌識別
首先還是用動圖先展示一下效果。進入軟體界面後,點擊圖片選擇按鈕選擇一張圖片,點擊「開始運行」即可自動識別車牌並顯示結果在界面上;點擊歷史識別記錄的表格序號可回看識別記錄。本功能的界面展示如下圖所示:

同樣的如果需要識別批量圖片,可以選擇一個包含多張圖片文件的文件夾,選擇好後點擊「開始運行」則逐個對每個文件進行檢測和識別,結果與單張圖片時類似,可通過表格記錄回看識別結果:

(二)車牌視頻識別效果展示
很多時候我們需要識別一段視頻中的車牌,這裡設計了視頻選擇功能。點擊視頻按鈕可選擇待檢測的視頻,系統會自動解析視頻逐幀識別車牌,並將結果記錄在右下角表格中,效果如下圖所示:

(三)攝像頭檢測效果展示
在真實場景中,我們往往利用設備攝像頭獲取實時畫面,同時需要對畫面中的車牌進行識別,因此本文考慮此功能。如下圖所示,點擊攝像頭按鈕後系統進入準備狀態,再點擊「開始運行」後,系統顯示實時畫面並開始檢測畫面中的車牌,識別結果展示並記錄:

2. 車牌檢測與識別
目前,智能交通系統中集成運用計算機視覺、物聯網、人工智慧等多種技術成為未來發展方向。其中,車牌識別(License Plate Recognition, LPR)技術作為一項重要技術,從獲取的圖像中提取目標車輛的車牌信息,成為完善智能交通管理運行的基礎。
由於本文介紹的是中文車牌,所以可以簡單了解一下國內汽車牌照的特點:字元數為七個,包括漢字、字母和數字。車牌顏色組合中,其中最常見的組合為普通小型汽車藍底白字和新能源汽車的漸變綠底黑字。

由於本文介紹的是中文車牌,所以可以簡單了解一下國內汽車牌照的特點:字元數為七個,包括漢字、字母和數字,車牌輪廓長寬比例基本固定。車牌顏色組合中,其中最常見的組合為普通小型汽車藍底白字和新能源汽車的漸變綠底黑字。總結來說,車牌是一個有特點的圖像區域,幾種特徵可以綜合起來確定車牌定位,所以之前就有利用車牌與周圍環境的差異的演算法。目前常見的車牌定位演算法有以下 4 種:基於顏色、紋理、邊緣信息的車牌定位演算法和基於人工神經網路的車牌定位演算法。
為了方便演示,博主繪製了一張車牌識別的流程圖,如下圖所示,常規的步驟包括圖像採集、預處理、車牌定位、字元分割、字元識別、輸出結果。深度學習技術成熟之後,端到端的網路模型使得這一過程變得簡單起來。從思想上來說,基於深度學習的車牌識別實現思路主要包括兩個部分:(1)車牌檢測定位;(2)車牌字元識別。

其中,車牌的檢測定位本質是一個特定的目標檢測(Object Detection)任務,即通過演算法框選出屬於車牌的位置坐標,以便將其與背景區分開來。可以認為檢測出的車牌位置才是我們的感興趣區域(Region Of Interest, ROI)。好用的方法如Cascade LBP,它是一種機器學習的方法,可以利用OPenCV訓練級聯分類器,依賴CPU進行計算,參考網址:
https://gitee.com/zeusees/HyperLPR。級聯分類器的方法對於常用場景效果比較好,檢測速度較快,曾經一度比較流行,但準確率一般。基於深度學習的檢測演算法有Mobilene-SSD、YOLO-v5等,利用大批量的標註數據進行訓練,訓練代碼可以參考開源代碼https://github.com/zeusees/License-Plate-Detector。
當ROI被檢測出來,如何對這一區域中的字元進行識別,這就涉及到採取的處理方式。第一種處理方式,首先利用一系列字元分割的演算法將車牌中的字元逐個分開,然後基於深度學習進行字元分類,得到識別結果,可參考的代碼地址:
https://github.com/LCorleone/A-Simple-Chinese-License-Plate-Generator-and-Recognition-Framework;第二種,區別於第一種先分割再分類的兩步走方式,利用端到端的CTC( Connectionist Temporal Classification)網路直接進行識別,代碼地址:https://github.com/armaab/hyperlpr-train。
這裡我們使用網上開源的HyperLPR中文車牌識別框架,首先導入OpenCV和hyperlpr,讀取一張車牌圖片調用架構中的車牌識別方法獲得結果,以下代碼來自官方的示例:
#導入包
from hyperlpr import *
#導入OpenCV庫
import cv2
#讀入圖片
image = cv2.imread("demo.jpg")
#識別結果
print(HyperLPR_plate_recognition(image))以上代碼運行結果如下,可以看出該方法識別了車牌的車牌字元、置信度值、車牌位置坐標、圖片尺寸等結果。

這樣的結果還不夠直觀,我們寫一個函數將車牌的識別結果標註在圖片上,首先導入相關依賴包,其代碼如下:
# 導入包
from hyperlpr import *
# 導入OpenCV庫
import cv2 as cv
from PIL import Image, ImageDraw, ImageFont
import numpy as np新建一個函數drawRectBox,將圖像數據、識別結果、字體等參數傳入,函數內部利用OpenCV和PIL庫添加標註框和識別結果的字元,其代碼如下:
def drawRectBox(image, rect, addText, fontC):
cv.rectangle(image, (int(round(rect[0])), int(round(rect[1]))),
(int(round(rect[2]) + 8), int(round(rect[3]) + 8)),
(0, 0, 255), 2)
cv.rectangle(image, (int(rect[0] - 1), int(rect[1]) - 16), (int(rect[0] + 75), int(rect[1])), (0, 0, 255), -1, cv.LINE_AA)
img = Image.fromarray(image)
draw = ImageDraw.Draw(img)
draw.text((int(rect[0] + 1), int(rect[1] - 16)), addText, (255, 255, 255), font=fontC)
imagex = np.array(img)
return imagex我們首先讀取圖片文件,利用前面的
HyperLPR_plate_recognition方法識別出車牌結果,調用以上函數獲得帶標註框的圖片,利用OpenCV的imshow方法顯示結果圖片,其代碼如下:
image = cv.imread('test3.jpeg') # 讀取選擇的圖片
res_all = HyperLPR_plate_recognition(image)
fontC = ImageFont.truetype("./platech.ttf", 14, 0)
res, confi, axes = res_all[0]
image = drawRectBox(image, axes, res, fontC)
cv.imshow('Stream', image)
c = cv.waitKey(0) & 0xff此時運行以上代碼可以得到如下結果:

同理,識別視頻中的車牌也可以做類似的操作,不過我們需要先對視頻文件進行逐幀讀取,然後採用以上的方式在圖片中標識出車牌並顯示。這部分代碼如下:
capture = cv.VideoCapture("./車牌檢測.mp4") # 讀取視頻文件
fontC = ImageFont.truetype("./platech.ttf", 14, 0) # 字體,用於標註圖片
i = 1
while (True):
ref, frame = capture.read()
if ref:
i = i + 1
if i % 5 == 0:
i = 0
res_all = HyperLPR_plate_recognition(frame) # 識別車牌
if len(res_all) > 0:
res, confi, axes = res_all[0] # 獲取結果
frame = drawRectBox(frame, axes, res, fontC)
cv.imshow("num", frame) # 顯示畫面
if cv.waitKey(1) & 0xFF == ord('q'):
break # 退出
else:
break以上代碼每5幀識別一次視頻中的車牌,將車牌的結果標註在畫面中進行實時顯示,運行結果的截圖如下所示:
車牌的識別部分代碼演示完畢,對此我們完成了圖片和視頻的識別,然而這些還是簡單的腳本呈現。為了方便更換圖片、視頻以及管理車牌,還需要設計文件選擇功能以及系統的UI界面。打開QtDesigner軟體,拖動以下控制項至主窗口中,車牌識別系統的界面設計如下圖所示:控制項界面部分設計好,接下來利用PyUIC工具將.ui文件轉化為.py代碼文件,通過調用界面部分的代碼同時加入對應的邏輯處理代碼。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/203219.html
微信掃一掃
支付寶掃一掃