车牌识别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的机器学习落地流程,涵盖了图像预处理、特征提取、目标定位、字符识别等核心环节,是机器学习算法从理论到实践的典型案例。

 

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐