【无标题】车辆识别AI工具实现教程
车牌识别AI工具实现教程
基于Python+OpenCV+Tesseract-OCR的机器学习实战案例
一、项目概述
车牌识别是计算机视觉+OCR技术的经典应用,本项目将从零实现一个车牌识别工具:从图片中自动定位车牌区域、识别车牌号码,完整复现机器学习算法的落地流程。
二、环境准备
1. 安装依赖库
打开终端执行以下命令,安装所需的Python库:
pip install opencv-python opencv-contrib-python pytesseract numpy pillow
2. 安装Tesseract-OCR引擎
Tesseract是开源的OCR识别引擎,需要单独安装:
• Windows:从Tesseract官网下载安装包,安装后配置环境变量
• Mac:执行brew install tesseract
• Linux:执行sudo apt install tesseract-ocr
注意:Windows用户需要在代码中指定Tesseract的安装路径,示例代码中已标注。
三、设计思路
整个车牌识别流程分为4个核心步骤,对应机器学习项目的完整链路:
1. 图像预处理:灰度化、去噪、边缘检测,突出车牌的轮廓特征
2. 车牌定位:通过轮廓筛选,找到符合车牌长宽比的矩形区域
3. 车牌字符分割:对车牌区域二值化、去噪,分割出单个字符
4. 字符识别:调用OCR工具识别字符,输出车牌号码
四、完整代码实现
import cv2
import numpy as np
import pytesseract
# 配置Tesseract路径(Windows用户需要取消注释并修改为自己的安装路径)
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def preprocess_image(image_path):
"""图像预处理:灰度化、高斯模糊、Canny边缘检测"""
# 读取图像
img = cv2.imread(image_path)
# 灰度化:减少色彩维度,突出轮廓
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯模糊:去除图像噪声
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# Canny边缘检测:提取图像边缘特征
edged = cv2.Canny(blur, 50, 150)
return img, edged
def locate_plate(edged):
"""车牌定位:筛选符合车牌特征的轮廓"""
# 查找所有轮廓
contours, _ = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 按轮廓面积从大到小排序,取前10个候选
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
plate_contour = None
# 筛选符合车牌特征的轮廓(长宽比约3:1到4:1,且为四边形)
for c in contours:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
if len(approx) == 4:
x, y, w, h = cv2.boundingRect(approx)
aspect_ratio = w / float(h)
if 3 <= aspect_ratio <= 4:
plate_contour = approx
break
return plate_contour
def recognize_plate_characters(plate_img):
"""车牌字符识别:OCR识别车牌区域的字符"""
# 车牌区域预处理:灰度化、二值化
plate_gray = cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY)
_, plate_thresh = cv2.threshold(plate_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# OCR识别配置:只识别车牌允许的字符(大写字母+数字)
custom_config = r'--oem 3 --psm 8 -c tessedit_char_whitelist=ABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
text = pytesseract.image_to_string(plate_thresh, config=custom_config)
return text.strip()
def main(image_path):
"""主函数:串联整个车牌识别流程"""
# 1. 图像预处理
img, edged = preprocess_image(image_path)
# 2. 定位车牌
plate_contour = locate_plate(edged)
if plate_contour is None:
print("未检测到车牌,请检查图片质量!")
return
# 3. 提取车牌区域
x, y, w, h = cv2.boundingRect(plate_contour)
plate_img = img[y:y+h, x:x+w]
# 4. 识别字符
plate_number = recognize_plate_characters(plate_img)
# 绘制识别结果:绿色框标注车牌,显示车牌号码
cv2.drawContours(img, [plate_contour], -1, (0, 255, 0), 2)
cv2.putText(img, plate_number, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# 显示结果
cv2.imshow("车牌识别结果", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(f"✅ 识别到的车牌号码:{plate_number}")
if __name__ == "__main__":
# 替换为你的车辆图片路径
main("car_image.jpg")
五、运行结果
1. 运行方式:将代码保存为plate_recognition.py,准备一张清晰的车辆图片(命名为car_image.jpg,和代码放在同一目录),执行python plate_recognition.py
2. 可视化结果:程序会弹出窗口,用绿色框标注图片中的车牌区域,并在框上方显示识别出的车牌号码
3. 控制台输出:终端会打印最终的车牌识别结果,示例:✅ 识别到的车牌号码:京A12345
六、优化与扩展
1. 识别准确率优化
• 针对模糊/夜间车牌:增加直方图均衡化、形态学开/闭运算提升预处理效果
• 自定义OCR模型:训练Tesseract适配更多车牌样式(如新能源车牌)
2. 功能扩展
• 批量识别:修改main函数,遍历文件夹实现批量车牌识别
• 实时识别:结合摄像头实现实时车牌检测
3. 部署优化
• 封装为API:用Flask/Django将代码封装为Web接口,支持在线识别
• 打包为EXE:用PyInstaller将代码打包为Windows可执行文件
七、总结
本项目完整复现了计算机视觉+OCR的机器学习落地流程,涵盖了图像预处理、特征提取、目标定位、字符识别等核心环节,是机器学习算法从理论到实践的典型案例。
更多推荐

所有评论(0)