车牌识别(License Plate Recognition,LPR)算是机器视觉方向里最经典的毕业设计题目之一。用 Python 做车牌识别,核心流程就四步:图像预处理、车牌定位、字符分割、字符识别,听起来不复杂,但真做起来,从环境配置到识别率调优,每一步都有坑。这篇文章我以自己带学生做这个题目的实际经验为基础,把方案选型、核心代码、测试思路和答辩要点一次讲清楚,顺便把那些教程里不会写的坑也一并填掉。不管你是刚拿到题目的本科生,还是想拿这个项目练手机器视觉的初学者,看完应该都能少走不少弯路。
选择这个题目的学生很多,但真正做出高分作品的很少。原因在于车牌识别项目最大的价值不是"调通一个代码",而是它把机器视觉里最常见的技术点全串起来了:颜色空间转换、边缘检测、形态学操作、轮廓分析、几何校正、光学字符识别,传统算法和深度学习方法都能落地。这意味着你做的不只是一个"调包"项目,而是一套完整的工程链路。毕设答辩时老师最喜欢问的就是"每一步为什么这么做",这篇文章里我会把每个选择的理由也讲透,方便你应付提问。
1. 整体方案设计:先想清楚再做,别上来就写代码
1.1 需求拆解与功能边界
做毕设第一件事不是找代码,而是把需求边界画清楚。一个完整的车牌识别系统,从输入到输出要经过这么几层:图像采集、图像预处理、车牌区域定位、车牌图像校正、字符分割、字符识别、结果输出。你要想清楚的是,这套系统是处理单张图片还是视频流,是只识别蓝牌还是也要兼容新能源绿牌和黄牌,是否需要支持夜间或低照度场景。这些决定了你后面每一步的技术选型,也直接决定了论文的工作量。
以常见的毕设要求来看,通常做到"输入一张包含车牌的图片,程序输出车牌号码字符串"就算达标。但如果你想拿高分,我建议至少补上倾斜校正和视频流识别两个功能块。倾斜校正能体现你对几何变换的理解,而视频流识别说明你的算法有实时性意识,这两个点都是答辩时的加分项。
功能边界画好之后,最忌讳的是想一步到位做"全网最全"的识别系统。我见过不少学生一开始就想识别七八种车牌类型、还要支持雨雪天气,结果做到最后连蓝牌都识别不稳。我的建议是:第一版只做蓝牌加新能源绿牌,场景先限定在白天、水平或轻微倾斜、车头朝前三个条件下,先把主链路跑通,再逐步放开约束。毕设评分看的是完整性、逻辑性和工作量,不是看你口头上能吹多少功能。
1.2 技术路线对比:传统视觉还是深度学习
这是整个项目最核心的决策点。两条路线都能做,但工作量和容错率差异很大。
传统机器视觉路线的思路是这样的:利用车牌的颜色特征(蓝色、绿色、黄色)或边缘特征在图像里找到候选区域,用形态学操作把候选区连成整体,再通过轮廓的宽高比、面积等几何条件筛选出真正的车牌位置;定位后用投影法或连通域分析把字符一个个切开;最后用模板匹配或SVM+HOG分类器识别字符。这条线的优点是完全不依赖GPU,普通笔记本CPU跑起来毫无压力,代码量大概几百行,每一步都能可视化,非常适合写论文、画流程框图。缺点是鲁棒性差,光照一变、角度一大、画面一糊,识别率就会明显往下掉。
深度学习路线的思路是用目标检测网络端到端定位车牌,用CNN或LSTM+CTC结构的识别网络直接完成字符识别。主流的做法是YOLOv5或YOLOv8做车牌检测,LPRNet或PaddleOCR的PP-LPR做字符识别。这条线的检测精度和泛化能力远好于传统方法,在真实道路场景下也能达到很高的检测率,但你需要准备标注数据、配置PyTorch环境、可能还要做模型剪枝或转换,环境问题带来的挫败感非常强,而且答辩时如果老师追问网络原理,你也得有心理准备。
我的建议是:如果时间紧张、之前没有深度学习基础,就选传统路线,但要在预处理和字符识别两个环节做得细致;如果时间充裕、想在算法上有亮点,就选"传统定位+深度学习识别"的混合路线。这里有个折中技巧:用OpenCV的HSV颜色空间定位车牌(速度快、不依赖训练数据),用训练好的LPRNet或PaddleOCR模型做字符识别(识别精度高、不用自己标注大量数据)。这样论文既有传统算法的过程分析,又有深度学习的效果对比,工作量和技术含量都够了。我自己带学生时最推荐的就是这个方案,累是累一点,但边查资料边做下来,机器视觉的底子能打得很扎实。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心环节拆解:定位、分割、识别到底难在哪
2.1 图像预处理与形态学参数原理
预处理是整个流程的第一步,也是很多人最容易写糊弄的一步。拿到相机原始图像后,第一件要做的事是去噪和增强。常用处理是转灰度图,再用高斯滤波消除噪声。高斯滤波核的大小一般取5x5,sigma自动计算即可,核太大图像会发虚,太小等于没滤波。这里有个很容易被忽略的点:车牌图像的分辨率如果本身很低(比如小于80x40),先做一次归一化放大或锐化,比单纯调滤波参数效果要好得多。
预处理里最有技术含量的是边缘检测和形态学操作。边缘检测常用Canny算子,它的两个阈值要按场景调。我一般用Canny(gray, 100, 200)起步,光照强的场景把低阈值提到120,夜间把低阈值降到60。高阈值和低阈值大约保持2:1到3:1的比例,这个比例能有效抑制梯度变化平缓的纹理,又不会把车牌字符边缘也砍掉。注意Canny之前一定要滤波,不然噪点会产生大量假边缘,后面腐蚀膨胀都救不回来。
接下来是形态学操作。很多初学者只知道"闭运算连接、开运算去噪",但参数一调就懵。开闭运算的本质是腐蚀和膨胀的组合,核的大小和形状直接决定效果。开运算是先腐蚀后膨
