如何使用 Python 檢測和識別汽車牌照

如何使用 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 庫之前,你應該在你的計算機上安裝它。為此:

  1. 打開任何基於 Chrome 的瀏覽器
  2. 下載Tesseract OCR安裝程序
  3. 運行安裝程序並像安裝任何其他程序一樣安裝它

準備好環境並安裝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。

在編程方面,實踐是掌握一門語言的核心。要練習您的技能,您需要從事有趣的項目。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *