車牌識別與標注:基于百度OCR與OpenCV的實現
在計算機視覺領域,車牌識別是一項極具實用價值的技術,廣泛應用于交通監控、智能停車場管理等領域。本文將介紹如何在macOS系統下,利用百度OCR API進行車牌識別,并結合OpenCV庫在圖片上繪制標注框和車牌號碼,實現一個完整的車牌識別與標注流程。整個工程將使用PyCharm進行組織和開發 。
一、系統環境與工程結構
系統環境
- 操作系統:macOS
- 開發工具:PyCharm
- Python版本:Python 3.x
工程結構
project-root/
├── src/
│ └── main.py
├── test5.jpg
└── STHeiti Light.ttc
src/main.py
:包含車牌識別與標注的代碼。test5.jpg
:用于測試的圖片文件。STHeiti Light.ttc
:從/System/Library/Fonts/STHeiti
拷貝的中文字體文件,用于在圖片上繪制中文文本。
二、百度OCR車牌識別API簡介
百度OCR(Optical Character Recognition,光學字符識別)提供了強大的車牌識別功能。通過向其API發送圖片數據,我們可以獲取車牌號碼、車牌顏色、車牌位置等信息。API返回的數據格式如下:
https://ai.baidu.com/tech/ocr_cars/plate
{"words_result": [{"number": "粵A7Z0K0","vertexes_location": [{"x": 145,"y": 482},{"x": 302,"y": 511},{"x": 294,"y": 569},{"x": 137,"y": 539}],"color": "blue","probability": [0.9999998808,1,1,0.9999991655,0.9999996424,0.9999986887,0.9999991655]}],"log_id": "1937791826711303139"
}
其中,number
字段表示識別到的車牌號碼;vertexes_location
字段是一個包含四個坐標的數組,表示車牌在圖片中的位置;color
字段表示車牌顏色;probability
字段是一個數組,表示每個字符識別的置信度。
三、使用OpenCV繪制車牌標注
在獲取到車牌信息后,我們需要在圖片上繪制標注框并顯示車牌號碼。這里我們使用了OpenCV庫,它是一個功能強大的計算機視覺庫,提供了豐富的圖像處理功能。
以下是繪制車牌標注的代碼實現:
import cv2
import numpy as np
import math
from PIL import Image, ImageDraw, ImageFontdef draw_parallelogram_with_text(image_path, coords, text="車牌區域", width_ratio=0.60, font_path="STHeiti Light.ttc"):"""在圖片上繪制平行四邊形并添加對齊且寬度按比例縮放的中文文本:param image_path: 圖片路徑:param coords: 平行四邊形的四個坐標點,格式為[(x1, y1), (x2, y2), (x3, y3), (x4, y4)]:param text: 要添加的文本,默認為"車牌區域":param width_ratio: 文本寬度占平行四邊形寬度的比例,默認為 0.6:param font_path: 中文字體文件路徑:return: 處理后的圖片"""# 讀取圖片image = cv2.imread(image_path)if image is None:raise FileNotFoundError(f"無法加載圖片:{image_path}")# 繪制平行四邊形cv2.fillPoly(image, [np.array(coords)], (255, 0, 0)) # 藍色填充# 計算平行四邊形寬度(取前兩點之間的距離作為參考寬度)p1, p2 = coords[0], coords[1]parallelogram_width = math.hypot(p2[0] - p1[0], p2[1] - p1[1])# 獲取包圍盒x_coords = [p[0] for p in coords]y_coords = [p[1] for p in coords]min_x, max_x = min(x_coords), max(x_coords)min_y, max_y = min(y_coords), max(y_coords)# 居中位置(先估算)pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(pil_image)# 初始字體大小init_font_size = 30font = ImageFont.truetype(font_path, init_font_size)# 【關鍵修改】獲取文本寬度(新方法)init_text_width = font.getlength(text)init_text_height = font.getmetrics()[0] # 獲取字體高度(ascent)# 根據比例調整字體大小scale = (parallelogram_width * width_ratio) / init_text_widthfont_size = int(init_font_size * scale)font = ImageFont.truetype(font_path, font_size)# 再次獲取實際文本尺寸text_width = font.getlength(text)text_height = font.getmetrics()[0]# 居中計算text_x = min_x + (max_x - min_x - text_width) // 2text_y = min_y + (max_y - min_y - text_height) // 2# 創建空白圖像用于繪制文字text_layer = Image.new("RGBA", pil_image.size, (0, 0, 0, 0))draw = ImageDraw.Draw(text_layer)draw.text((text_x, text_y), text, fill=(255, 255, 255, 255), font=font)# 計算旋轉角度def get_angle(p1, p2):dx = p2[0] - p1[0]dy = p2[1] - p1[1]return math.degrees(math.atan2(dy, dx))angle = get_angle(coords[0], coords[1])# 旋轉文本圖層rotated_text = text_layer.rotate(-angle, center=(text_x + text_width // 2, text_y + text_height // 2), expand=0)# 合并到原圖pil_image.paste(rotated_text, mask=rotated_text.split()[3]) # 使用 alpha 通道做透明融合# 轉回 OpenCV 格式result_image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)return result_image# 示例使用
if __name__ == "__main__":image_path = "../test5.jpg" # 替換為你的圖片路徑# 示例坐標 test3# coords = [(417, 531), (583, 519), (586, 569), (420, 581)] # 替換為你的坐標值# test5coords = [(145, 482), (302, 511), (294, 569), (137, 539)] # 替換為你的坐標值result_image = draw_parallelogram_with_text(image_path, coords)# 顯示結果cv2.imshow("Result", result_image)cv2.waitKey(0)cv2.destroyAllWindows()# 保存結果圖片cv2.imwrite("result_image.jpg", result_image)
運行效果:
代碼解析
- 圖片讀取與繪制平行四邊形:使用
cv2.imread
讀取圖片,然后通過cv2.fillPoly
函數根據車牌的四個坐標點繪制平行四邊形。 - 計算平行四邊形寬度與包圍盒:通過計算兩個相鄰點之間的距離來估算平行四邊形的寬度,并獲取包圍盒的坐標范圍。
- 文本繪制與字體大小調整:使用Pillow庫(PIL)繪制文本。首先根據平行四邊形寬度和指定的比例調整字體大小,然后計算文本的居中位置。
- 文本旋轉與融合:計算文本旋轉角度,將文本圖層旋轉后與原圖融合,實現文本與平行四邊形的對齊。
四、實際應用與優化
實際應用場景
- 交通監控系統:在交通監控中,車牌識別可以用于車輛的自動識別與追蹤,幫助交通管理部門更好地管理交通流量,打擊交通違法行為。
- 智能停車場管理:通過車牌識別,停車場可以實現自動計費、車輛進出管理等功能,提高停車場的運營效率和用戶體驗。
優化建議
- 性能優化:在實際應用中,車牌識別和標注的性能至關重要。可以通過多線程或異步處理來提高處理速度,同時優化代碼邏輯,減少不必要的計算。
- 準確性提升:雖然百度OCR提供了較高的識別準確率,但在一些復雜場景下(如車牌污損、遮擋等)仍可能出現識別錯誤。可以通過增加預處理步驟(如圖像增強、去噪等)來提高識別的準確性。
- 用戶體驗優化:在展示結果時,可以考慮添加更多的交互功能,如車牌信息的詳細展示、歷史記錄查詢等,提升用戶的使用體驗。
五、總結
本文介紹了在macOS系統下,基于百度OCR和OpenCV的車牌識別與標注技術。通過調用百度OCR API獲取車牌信息,并使用OpenCV在圖片上繪制標注框和車牌號碼,實現了一個完整的車牌識別與標注流程。整個工程使用PyCharm進行組織和開發,代碼源文件位于src/main.py
,資源文件如test5.jpg
和STHeiti Light.ttc
位于工程根目錄。在實際應用中,可以根據具體需求進行優化和擴展,以滿足不同的應用場景。希望本文能夠為從事相關工作的開發者提供一定的參考和幫助。
以我之思,借AI之力