如何使用 Python 檢測和識別汽車牌照
車牌檢測和識別技術有很多應用。可用於道路系統、無票停車場、車輛門禁住宅等。該技術結合了計算機視覺和人工智能。
您將使用 Python 創建車牌檢測和識別程序。該程序將獲取輸入圖像,對其進行處理以檢測和識別車牌,最後顯示車牌的字符作為輸出。
設置 Python 環境
要順利地完成本教程,您需要熟悉 Python 基礎知識。首先要設置程序的環境。
在開始編碼之前,您需要在您的環境中安裝一些庫。打開任何 Python IDE 並創建一個 Python 文件。在終端上運行每個命令以安裝相應的庫。您應該在計算機上預先安裝 Python PIP。
- OpenCV-Python:您將使用此庫預處理輸入圖像並顯示各種輸出圖像。
pip install OpenCV-Python
- imutils:您將使用此庫將原始輸入圖像裁剪為所需的寬度。
pip install imutils
- pytesseract:您將使用此庫提取車牌的字符並將其轉換為字符串。
pip install pytesseract
pytesseract 庫依賴於Tesseract OCR引擎進行字符識別。
Tesseract OCR 是什麼以及如何在您的計算機上安裝它
Tesseract OCR 是一種可以識別語言字符的引擎。在使用 pytesseract 庫之前,你應該在你的計算機上安裝它。為此:
- 打開任何基於 Chrome 的瀏覽器
- 下載Tesseract OCR安裝程序
- 運行安裝程序並像安裝任何其他程序一樣安裝它
準備好環境並安裝tesseract OCR後,您就可以編寫程序了。
1.導入庫
首先導入您在環境中安裝的庫。導入庫允許您在項目中調用和使用它們的功能。
import cv2
import imutils
import pytesseract
您需要將OpenCV-Python庫導入為cv2。使用與安裝它們相同的名稱導入其他庫。
2.接受輸入
然後將pytesseract指向安裝Tesseract引擎的位置。使用cv2.imread函數將汽車圖像作為輸入。將圖像名稱替換為您正在使用的圖像的名稱。將圖像存儲在與項目相同的文件夾中,以簡化操作。
pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
original_image = cv2.imread('image3.jpeg')
您可以將以下輸入圖像替換為您想要使用的圖像。
3. 預處理輸入
將圖像寬度調整為 500 像素。然後將圖像轉換為灰度圖像,因為精明的邊緣檢測功能僅適用於灰度圖像。最後,調用bilateralFilter函數來降低圖像中的噪聲。
original_image = imutils.resize(original_image, width=500)
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
gray_image = cv2.bilateralFilter(gray_image, 11, 17, 17)
4.檢測輸入車牌
車牌檢測就是確定汽車上有車牌特徵的部分的過程。
執行邊緣檢測
首先調用cv2.Canny函數,它將自動檢測預處理圖像的邊緣。
edged_image = cv2.Canny(gray_image, 30, 200)
我們將從這些邊緣找到輪廓。
尋找輪廓
調用cv2.findContours函數並傳遞邊緣圖像的副本。此功能將檢測輪廓。使用cv2.drawContours函數在原始圖像上繪製檢測到的輪廓。最後,輸出繪製了所有可見輪廓的原始圖像。
contours, new = cv2.findContours(edged_image.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
img1 = original_image.copy()
cv2.drawContours(img1, contours, -1, (0, 255, 0), 3)
cv2.imshow("img1", img1)
該程序會獨特地繪製它在汽車圖像上找到的所有輪廓。
找到輪廓後,您需要對它們進行排序以確定最佳候選者。
排序輪廓
根據最小面積 30 對輪廓進行排序。忽略下方的輪廓,因為它們不太可能是車牌輪廓。複製原始圖像並在圖像上繪製前 30 個輪廓。最後,顯示圖像。
contours = sorted(contours, key = cv2.contourArea, reverse = True)[:30]
# stores the license plate contour
screenCnt = None
img2 = original_image.copy()
# draws top 30 contours
cv2.drawContours(img2, contours, -1, (0, 255, 0), 3)
cv2.imshow("img2", img2)
現在的輪廓比開始時少。繪製的唯一輪廓是近似包含車牌的輪廓。
最後,您需要遍歷排序後的輪廓並確定哪個是車牌。
遍歷前 30 個輪廓
創建一個 for 循環以遍歷輪廓。尋找具有四個角的輪廓,並確定其周長和坐標。存儲包含車牌的輪廓圖像。最後在原圖上繪製車牌輪廓並顯示。
count = 0
idx = 7
for c in contours:
# approximate the license plate contour
contour_perimeter = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.018 * contour_perimeter, True)
# Look for contours with 4 corners
if len(approx) == 4:
screenCnt = approx
# find the coordinates of the license plate contour
x, y, w, h = cv2.boundingRect(c)
new_img = original_image [ y: y + h, x: x + w]
# stores the new image
cv2.imwrite('./'+str(idx)+'.png',new_img)
idx += 1
break
# draws the license plate contour on original image
cv2.drawContours(original_image, [screenCnt], -1, (0, 255, 0), 3)
cv2.imshow("detected license plate", original_image)
循環後,您的程序已識別出包含車牌的輪廓。它僅繪製車牌輪廓。
5.識別檢測到的車牌
識別車牌意味著讀取車牌裁剪圖像上的字符。加載您之前存儲的車牌圖像並顯示它。然後,調用pytesseract.image_to_string函數並傳遞裁剪後的車牌圖像。此函數將圖像中的字符轉換為字符串。
# filename of the cropped license plate image
cropped_License_Plate = './7.png'
cv2.imshow("cropped license plate", cv2.imread(cropped_License_Plate))
# converts the license plate characters to string
text = pytesseract.image_to_string(cropped_License_Plate, lang='eng')
裁剪後的車牌如下圖所示。它上面的字符將是您稍後在屏幕上打印的輸出。
檢測並識別車牌後,您就可以顯示輸出了。
6. 顯示輸出
這是最後一步。您將提取的文本打印到屏幕上。此文本包含車牌的字符。
print("License plate is:", text)
cv2.waitKey(0)
cv2.destroyAllWindows()
該程序的預期輸出應類似於下圖:
可以在終端上看到車牌文本。
提高你的 Python 技能
在 Python 中檢測和識別汽車牌照是一個有趣的項目。它具有挑戰性,因此它應該可以幫助您更多地了解 Python。
在編程方面,實踐是掌握一門語言的核心。要練習您的技能,您需要從事有趣的項目。
發佈留言