利用Python識別車牌技術,幾行代碼實現

車牌識別在高速公路中有著廣泛的應用,比如我們常見的電子收費(ETC)系統和交通違章車輛的檢測,除此之外像小區或地下車庫門禁也會用到,基本上凡是需要對車輛進行身份檢測的地方都會用到。

簡介

車牌識別系統(Vehicle License Plate Recognition)是計算機視頻圖像識別技術在車輛牌照識別中的一種應用,通常一個車牌識別系統主要包括以下這四個部分:

  • 車輛圖像獲取
  • 車牌定位
  • 車牌字符分割
  • 車牌字符識別

我們再來看一下百科中對車牌識別技術的描述:

車牌識別技術要求能夠將運動中的汽車牌照從複雜背景中提取並識別出來,通過車牌提取、圖像預處理、特徵提取、車牌字符識別等技術,識別車輛牌號、顏色等信息,目前最新的技術水平為字母和數字的識別率可達到 99.7%,漢字的識別率可達到 99%。
PS注意:在這裡還是提醒下,很多人學Python過程中會遇到各種煩惱問題,沒有人解答容易放棄。為此我建了個python學習資源群裡面有最新學習資料,如果你想學python,可以關注我,後臺私信我 ‘py’ 自動獲取最新python教程資料!還有老司機解答哦!

實現方式

我們這裡不做太複雜的車輛動態識別,只演示從圖像中識別車牌信息,車牌識別功能的實現方式大致分為兩種,一種是自己編寫代碼實現,另一種是藉助第三方 API 接口實現。

自己實現

如果我們想要通過 Python 自己手動編碼實現車牌識別功能,可以藉助一些 Python 庫,比如:OpenCV、TensorFlow 等,這種方式因為每一個功能點都需要我們自己編碼實現,所有會相對複雜一些,另一方面如果我們想要保證識別的準確性,可能需要做大量的實驗,也就是說會花費更多的時間。

第三方接口

現在已經有一些第三方平臺實現好了車牌識別的功能,並且他們對外提供了 API 接口,我們只需要調用他們提供的接口即可,這種方式實現就相對簡單了一些,並且通常接口提供方對外提供的接口功能的準確性也是基本可以保證的,原因很簡單,如果接口功能太差的話,一是自己打臉,還有就是基本不會有什麼人使用,也就失去了接口對外提供的價值了,另外第三方接口可能會收取一定費用,因此,如果現實中我們具體實現的話要綜合考慮。

具體實現

綜合上面的情況,我們這裡採用第三方接口的方式來實現車牌識別的功能,接口提供方我們選擇百度雲提供的接口,百度雲接口提供了免費額度,簡單來說就是每天可以免費使用多少次,如果超過了這個次數就需要交錢什麼的了,文檔地址為: https://cloud.baidu.com/doc/OCR/index.html ,下面來看一下具體實現過程。

SDK 安裝

百度雲 SDK 對多種語言提供了支持,比如:Python、Java、C++、IOS、Android 等,這裡我們安裝 Python 版的 SDK,安裝很簡單,使用 pip install baidu-aip 命令即可,SDK 支持 Python 的版本為:2.7+ 與 3.x,SDK 目錄結構如下:

<code>├── README.md
├── aip // SDK 目錄
│ ├── __init__.py // 導出類
│ ├── base.py // aip 基類
│ ├── http.py // http 請求
│ └── ocr.py //OCR
└── setup.py // setuptools 安裝/<code>

創建應用

SDK 安裝好後,我們接著需要創建應用了,這裡需要一個百度賬號或百度雲賬號,如果沒有的話自己註冊一個即可,登錄及註冊地址為: https://login.bce.baidu.com/?redirect=http%3A%2F%2Fcloud.baidu.com%2Fcampaign%2Fcampus-2018%2Findex.html ,登錄之後,我們將鼠標移動到登錄頭像位置,接著在彈出菜單中單擊用戶中心,如下圖所示:

利用Python識別車牌技術,幾行代碼實現

系統

如果是首次進入的話,勾選一下相應信息,如下圖所示:

利用Python識別車牌技術,幾行代碼實現

系統

信息勾選完了之後,點擊保存按鈕。

接著將鼠標移動到左側欄中 > 符號位置,再依次選擇人工智能和文字識別,如下圖所示:

利用Python識別車牌技術,幾行代碼實現

方法

點擊之後會進入到下圖中:

利用Python識別車牌技術,幾行代碼實現

佈局

我們點擊創建應用,進入下圖中:

利用Python識別車牌技術,幾行代碼實現

信息

這裡我們只需要填一下應用名稱和下面的應用描述即可,填寫完畢之後點擊立即創建。

創建完後,我們再返回應用列表,如下圖所示:

利用Python識別車牌技術,幾行代碼實現

信息

這裡我們需要用到三個值:AppID、API Key 和 Secret Key。

具體實現

應用創建完了,我們就可以調用接口實現車牌識別功能了。

首先,我們要創建 AipOcr,AipOcr 是 OCR 的 Python SDK 客戶端,為使用 OCR 的開發人員提供了一系列的交互方法,代碼實現也比較簡單,如下所示:

<code>from aip import AipOcr

# 自己的 APPID AK SK
APP_ID = '自己的 App ID'
API_KEY = '自己的 Api Key'
SECRET_KEY = '自己的 Secret Key'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)/<code>

在上面代碼中,常量 APP_ID、API_KEY 和 SECRET_KEY 就是我們在查看應用列表時說的需要用到的常量值,這些值均為字符串,用於標識用戶,為訪問做簽名驗證。

如果我們需要配置 AipOcr 的網絡請求參數,可以在構造 AipOcr 之後調用接口設置參數,目前支持兩個參數,看一下代碼實現:

<code># 建立連接的超時時間,單位為毫秒
client.setConnectionTimeoutInMillis(5000)
# 通過打開的連接傳輸數據的超時時間,單位為毫秒

client.setSocketTimeoutInMillis(5000)/<code>

總的來說通過接口方式實現車牌識別功能是比較簡單的,以如下圖為例:

利用Python識別車牌技術,幾行代碼實現

車牌

實現代碼如下:

<code>from aip import AipOcr

APP_ID = '自己的 App ID'
API_KEY = '自己的 Api Key'
SECRET_KEY = '自己的 Secret Key'
# 創建客戶端對象
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

# 建立連接的超時時間,單位為毫秒
client.setConnectionTimeoutInMillis(5000)
# 通過打開的連接傳輸數據的超時時間,單位為毫秒
client.setSocketTimeoutInMillis(5000)

# 讀取圖片
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()

image = get_file_content('car.jpeg')
res = client.licensePlate(image)
print('車牌號碼:' + res['words_result']['number'])
print('車牌顏色:' + res['words_result']['color'])/<code>

執行結果:

<code>車牌號碼:川QK9777
車牌顏色:blue/<code>

上面代碼實現的是對一張圖片中的一個車牌進行識別,當然接口還支持對一張圖片中的多個車牌進行識別,只需使用 licensePlate(image, options) 即可, 以如下圖為例:

利用Python識別車牌技術,幾行代碼實現

車牌

實現代碼如下:

<code>from aip import AipOcr

APP_ID = '自己的 App ID'
API_KEY = '自己的 Api Key'
SECRET_KEY = '自己的 Secret Key'
# 創建客戶端對象
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 建立連接的超時時間,單位為毫秒
client.setConnectionTimeoutInMillis(5000)
# 通過打開的連接傳輸數據的超時時間,單位為毫秒
client.setSocketTimeoutInMillis(5000)

# 讀取圖片
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()

image = get_file_content('cars.png')
options = {}
# 參數 multi_detect 默認為 false
options['multi_detect'] = 'true'
res = client.licensePlate(image, options)
for wr in res['words_result']:
print('車牌號碼:' + wr['number'])
print('車牌顏色:' + wr['color'])/<code>

執行結果:

<code>車牌號碼:京N6HZ61
車牌顏色:blue
車牌號碼:魯NS1A26
車牌顏色:blue/<code>

總結

本文我們先對車牌識別進行了一些介紹,之後利用百度雲接口實現了單個和多個車牌的識別功能,通過本文我們可以對車牌識別的相關概念和具體實現有一些瞭解。注意:在這裡還是提醒下,很多人學Python過程中會遇到各種煩惱問題,沒有人解答容易放棄。為此我建了個python學習資源群裡面有最新學習資料,如果你想學python,可以關注我,後臺私信我 ‘py’ 自動獲取最新python教程資料!還有老司機解答哦!



分享到:


相關文章: