领取优惠


AI人工智能毕业设计课题实战:基于PyCharm的车牌识别系统从零搭建指南

摘要:许多计算机专业学生在完成AI毕业设计时,常因缺乏工程化经验而陷入环境配置混乱、模型调用错误或代码结构松散等问题。本文以“车牌识别系统”为具体课题,手把手指导新手在PyCharm中构建端到端的AI应用,涵盖图像预处理、OCR模型选型(EasyOCR vs PaddleOCR)、本地部署与结果可视化。读者将掌握模块化开发流程、调试技巧及可复用的项目结构,显著提升毕设完成效率与代码质量。


1. 背景痛点:为什么“跑通”比“跑分”更难

做毕设时,很多同学能把论文里的公式推导得头头是道,却在真正敲代码时卡壳:

  • 环境配了三天,import 依旧飘红
  • 网上抄来的脚本一跑,路径写死、全局变量乱飞,调试半小时找不到 bug
  • 导师一句“演示时换张图还能识别吗”,直接原地社死

归根结底,缺的不是算法知识,而是“工程化”思维:如何把模型当成零件,组装成可复用、可扩展、可演示的系统。下面以“车牌识别”为例,带你用 PyCharm 把“能跑”升级为“能看、能改、能交”。


2. 技术选型:三条路线谁更适合新手

方案 依赖量级 硬件要求 中文车牌零样本效果 代码量/易读性 毕设推荐指数
OpenCV+EasyOCR 轻量,纯 pip CPU 可跑 良好 少,函数式
PaddleOCR 中等,需装 paddle CPU 可跑,GPU 更快 优秀 中,配置多
YOLOv5+CRNN 重量,需编译 CUDA 最好有 GPU 需自训数据 多,框架杂

结论:想两周内出 demo,选 OpenCV+EasyOCR;想冲优秀论文,再考虑 PaddleOCR;YOLO+CRNN 留给有卡有数据的大佬。


3. 项目骨架:先搭架子再填肉

在 PyCharm 新建项目 PlateRecognizer,勾选 venv 自动建虚拟环境,目录如下:

PlateRecognizer/
├── data/               # 测试图片
├── model/              # 预训练权重(可选)
├── plate_recognition/  # 核心包
│   ├── __init__.py
│   ├── detector.py     # 车牌定位
│   ├── recognizer.py   # 字符识别
│   └── utils.py        # 图像 IO、可视化
├── main.py             # 一键运行入口
├── requirements.txt
└── README.md

好处:导师要看代码,直接点进包,不迷路;自己调试,模块职责单一,断点不蹦迪。


4. 核心实现拆解

4.1 图像采集与预处理

  • 手机拍、监控截帧、网上爬均可,建议先统一缩放到 720p,减少后期运算
  • 颜色空间用 BGR→HSV 过滤蓝色/黄色区域,快速缩小搜索范围
  • 高斯模糊+Sobel 横纵梯度,突出车牌边缘

4.2 车牌定位(detector.py)

  1. 边缘检测后用闭运算填缝
  2. findContours 找矩形,宽高比 3:1~5:1 过滤
  3. 透视矫正四点,输出 宽:高 = 140:44 的标准图,供 OCR 识别

关键函数示例:

def locate_plate(image_bgr):
    """
    输入: 原始车载图
    输出: 定位到的车牌图 or None
    """
    # 1. 颜色+梯度预处理
    hsv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, (100,80,80), (130,255,255))  # 蓝牌
    edge = cv2.Sobel(mask, cv2.CV_8U, 1, 0)
    # 2. 闭运算+轮廓
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20,5))
    closed = cv2.morphologyEx(edge, cv2.MORPH_CLOSE, kernel)
    contours, _ = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 3. 几何过滤
    for cnt in contours:
        rect = cv2.minAreaRect(cnt)
        w, h = rect[1]
        if 3 <= w/h <= 5 and w*h > 5000:
            box = cv2.boxPoints(rect)
            plate = four_point_transform(image_bgr, box)  # 透视矫正
            return cv2.resize(plate, (140, 44))
    return None

4.3 字符识别(recognizer.py)

EasyOCR 一行代码搞定:

import easyocr
reader = easyocr.Reader(['ch_sim', 'en'], gpu=False)  # 首次自动下载权重

def recognize_text(plate_img):
    result = reader.readtext(plate_img, detail=0, allowlist='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云藏陕甘青宁新')
    return ''.join(result)

PaddleOCR 同理,只需换 API,注意权重缓存路径别带中文,否则 Win 下易炸。

4.4 结果输出与可视化

  • 原图画框+识别文本,OpenCV putText 支持中文需转 PIL
  • 日志用 logging 写文件,演示时给导师看实时截图


5. 性能与安全:毕设也要讲武德

  1. 本地跑 100 张 720p 图,CPU 平均 1.2 s/张,内存峰值 450 MB,轻薄本无压力
  2. 输入校验:拒绝非图片后缀,防止 cv2.imread 返回 None 导致后续崩溃
  3. 路径安全:使用 Path.resolve() 杜绝 ../../../etc/passwd 类遍历
  4. 模型权重放项目外,Git 用 .gitignore 忽略,仓库 < 5 MB,方便传 GitHub 私有库

6. PyCharm 避坑 30 条浓缩版

  • 新建项目务必选 New environment using Virtualenv,把“继承全局站点包”勾掉,防止系统包污染
  • requirements.txtpip installpip freeze > requirements.txt,别手写版本号,容易玄学冲突
  • 中文路径:EasyOCR 权重默认下在 C:\Users\你的中文名\.EasyOCR\,可在代码里 os.environ['EASYOCR_MODULE_PATH'] = './model' 指到英文目录
  • 解释器切换:右上角 Add Interpreter > Existing environment 选中 venv 的 python.exe,避免调试时跑的是系统 Python
  • 断点调试:在 recognize_text 里打断点,看返回 result 是空列表还是 None,快速定位是检测还是识别环节翻车

7. 完整可运行 demo(main.py)

from pathlib import Path
import cv2
from plate_recognition.detector import locate_plate
from plate_recognition.recognizer import recognize_text

def process_image(image_path: Path):
    img = cv2.imread(str(image_path))
    plate = locate_plate(img)
    if plate is None:
        print('未检测到车牌')
        return
    text = recognize_text(plate)
    print('识别结果:', text)
    cv2.imshow('plate', plate)
    cv2.waitKey(0)

if __name__ == '__main__':
    import sys
    image_file = Path(sys.argv[1]) if len(sys.argv) > 1 else Path('data/test1.jpg')
    process_image(image_file)

运行:

(venv) $ python main.py data/test1.jpg
识别结果: 京A12345

8. 拓展思考:从单张到服务

  • 多车牌:把 locate_plate 改成 locate_plates,返回列表,循环识别即可
  • Web 服务:用 Flask 封装 /upload 接口,前端拖图片,后端返回画框图+JSON,10 行代码搞定
  • 模型升级:收集本校停车楼 2 千张标注,用 PaddleOCR 训练自定义字典,准确率可从 92% 提到 98%,足够写一章实验结果对比

写完这篇笔记,我的最大感受是:毕设不是写论文,而是“把论文跑起来”。当你能在 PyCharm 里一键出结果,导师问“代码在哪”时,自信地按下 F5,就已经赢了一半。剩下的半页纸,不过是把日志里的数字搬到 Word 里罢了。祝你毕业顺利,也欢迎把多车牌、Web 部署的坑继续分享给我,一起把“能跑”升级成“能上线”。

领取优惠


Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐