Python | OpenCV 專案:車牌辨識應用
📚 前言
在上一篇 即時人臉辨識系統 中,我們建立了一個完整的人臉辨識 pipeline。
這一篇要挑戰另一個經典應用:車牌辨識(License Plate Recognition,LPR)。
車牌辨識結合了邊緣偵測、輪廓分析、透視矯正與 OCR 文字辨識,是一個整合前面多個章節知識的綜合專案。
🎯 專案目標
- 從圖片或影片畫面中定位車牌區域
- 對車牌區域進行透視矯正與前處理
- 使用 EasyOCR 辨識車牌號碼
- 以影片檔或 MJPEG 串流掃描,顯示即時辨識結果
🎨 範例圖片
- 來源:Pexels - License Plate Image,屬於無版權圖片,可自由下載與使用。
- 內容:圖片車頭且有拍攝到車牌,非常適合用來做車牌辨識測試。
- 下載後將檔名改為
license_plate.jpg,放到專案的assets/目錄下。
🛠️ 套件安裝
步驟 1:安裝 EasyOCR
1 | pip install easyocr |
步驟 2:修復 OpenCV(必做)
pip install easyocr 會連帶安裝 opencv-python-headless(無 GUI 版本),覆蓋原先的 opencv-python / opencv-contrib-python,造成下列兩種常見錯誤:
cv2.imshow→The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support.cv2.imread→AttributeError: module 'cv2' has no attribute 'imread'(多個 opencv 變體並存時出現)
最穩定的做法是完整清除所有 opencv 變體後再乾淨安裝:
1 | # 1. 清除所有 opencv 變體(無論是否存在都執行一次) |
步驟 3:驗證安裝
1 | import cv2 |
💡 EasyOCR 首次執行時會自動下載語言模型(繁體中文 + 英文約 200MB),需要網路連線。
💡 執行時若看到
Using CPU. Note: This module is much faster with a GPU.,這是gpu=False的正常提示訊息,不是錯誤;本篇示範以 CPU 執行即可,若機器有 CUDA GPU 可將easyocr.Reader(["en"], gpu=True)以加速推論。
💡 若
pip list出現WARNING: Ignoring invalid distribution -xxx,代表 site-packages 內有~xxx開頭的殘留資料夾(先前安裝被中斷留下),不影響本次安裝;可執行Remove-Item -Recurse -Force "<venv 路徑>\Lib\site-packages\~*"清除。
💻 步驟一:從靜態圖片辨識車牌
1 | # recognize_plate.py |

圖:偵測圖片中的車牌輪廓區域,透過 Otsu 二值化前處理後使用 EasyOCR 辨識車牌號碼
💻 步驟二:改善辨識率的前處理
對四角點車牌區域進行透視矯正,將傾斜或仰角拍攝的車牌展平為正面視角
光線與角度影響辨識率很大,可加入透視矯正提升準確度:
1 | # perspective_transform.py |
💻 步驟三:從影片或串流辨識車牌
步驟一的輪廓法(approxPolyDP)適合乾淨的車牌近照,但在真實行車影片中背景雜訊過多,常常找不到四邊形或找錯位置,再加上只取「面積最大」的候選框,命中率很低。
本步驟改為直接把整幀交給 EasyOCR 內建的文字偵測模型(CRAFT)偵測所有文字區塊,再用信心度與長寬比挑出最像車牌的那一塊,比輪廓法穩定很多。
同時以影片檔或 MJPEG 串流取代即時攝影機,不需要攝影機設備也不涉及個人隱私即可完整練習。建議使用行車記錄器影片、停車場監控影片或自行拍攝的車輛影片作為測試素材;若需要即時畫面,也可改用手機 App(例如 IP Webcam)提供的 MJPEG 串流 URL,程式邏輯完全相同。
1 | # scan_video.py |

圖:讀取行車影片,EasyOCR 在整幀畫面偵測所有文字後以信心度與長寬比過濾,標出最可能的車牌並顯示辨識結果
📷 改用即時攝影機:將
video_path = "assets/traffic.mp4"改為cap = cv2.VideoCapture(0),即可改為即時攝影機辨識,程式邏輯完全相同。
📡 改用 MJPEG 串流:將
video_path改為 MJPEG URL(例如手機 App「IP Webcam」提供的http://<手機 IP>:8080/video),即可從手機或 IP 攝影機取得即時畫面。
💡 效能提示:在整幀畫面跑 OCR 比裁切小區域慢,CPU 環境下一次約 0.5~2 秒;
interval = 1.0已經留了緩衝,若仍卡頓可調高到2.0,或將畫面先縮小(frame = cv2.resize(frame, (640, 360)))再送 OCR。
⚠️ 注意事項
- 輪廓法的侷限性:
approxPolyDP找四邊形的方法在複雜背景下容易失效,若需要更穩健的車牌定位,建議改用 YOLOv8 訓練一個車牌偵測模型(定位更精準)。 - OCR 不設定
allowlist會辨識出許多雜訊:台灣車牌只有英數字與-,設定allowlist可大幅提升準確率。 - 即時辨識不要每幀都跑 OCR:EasyOCR 速度較慢,用時間間隔(
interval)控制呼叫頻率,避免幀率過低。 - 繁體中文車牌:若需辨識含中文字(如機車牌),將
easyocr.Reader(["en"])改為easyocr.Reader(["ch_tra", "en"])。 - MJPEG 串流延遲:透過網路讀取 MJPEG 串流時若出現畫面卡頓,可降低串流解析度或改回本機影片檔測試,避免網路狀況影響辨識結果。
- EasyOCR 安裝會覆蓋 OpenCV:若執行時出現
cv2.imshow未實作或cv2 has no attribute 'imread'等錯誤,請回頭依「套件安裝」的完整步驟清除所有 opencv 變體後再重新安裝opencv-contrib-python。切記僅執行pip uninstall opencv-python-headless再安裝往往不夠,需一次移除所有變體才能避免殘留衝突。
📊 進階方向
- 用 YOLOv8 取代輪廓法定位車牌:準確度大幅提升,適合多車輛場景
- 加入資料庫查詢:辨識到車牌後,查詢黑名單或收費系統
- 多幀投票:同一輛車連續辨識 5 幀,取出現最多次的號碼作為最終結果,提升準確率
🎯 結語
車牌辨識整合了輪廓分析、透視矯正與 OCR,是一個能實際部署的完整應用。
下一篇將進入 OpenCV 專案:小型圖片分類專案,把模型訓練篇學到的遷移學習技術整合成一個端對端的分類系統。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
註:以上參考了
EasyOCR GitHub
OpenCV 官方文件 — Contour Features
OpenCV 官方文件 — Geometric Transformations
