共计 1946 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
车牌识别是计算机视觉在智能交通领域的典型应用,但实际落地时会遇到各种挑战:

- 光照敏感 :夜间低光照或强反光会导致车牌区域难以检测
- 角度变形 :摄像头拍摄角度造成的透视变形影响字符分割
- 复杂背景 :车身颜色与车牌相近时增加定位难度
- 字符粘连 :车牌污损或倾斜导致的字符连接问题
传统方法依赖固定阈值和规则判断,在复杂场景下鲁棒性较差。比如单纯使用颜色过滤会因环境光变化失效,固定尺寸的滑动窗口检测无法适应不同距离的车牌。
技术选型对比
实现车牌识别主要有三种技术路线:
- 传统图像处理方案
- 优点:无需训练数据,计算资源消耗低
- 缺点:规则复杂,需针对不同场景调参
-
代表:OpenCV 的形态学处理 + 轮廓分析
-
深度学习端到端方案
- 优点:识别率高,抗干扰能力强
- 缺点:需要大量标注数据,部署成本高
-
代表:YOLO+CRNN 模型
-
混合方案 (本文采用)
- 定位阶段:使用 OpenCV 传统算法
- 识别阶段:结合模板匹配与 SVM
- 平衡点:兼顾实时性与准确率
核心实现流程
1. 车牌定位
关键技术栈 :HSV 色彩空间 + Sobel 边缘检测 + 形态学处理
// 示例代码:车牌粗定位
Mat hsv, mask;
cvtColor(src, hsv, COLOR_BGR2HSV);
inRange(hsv, Scalar(100, 80, 80), Scalar(140, 255, 255), mask);
// 形态学闭操作填充细小空洞
Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 3));
morphologyEx(mask, mask, MORPH_CLOSE, kernel);
处理流程 :
- 转换到 HSV 空间提取蓝色 / 黄色区域
- 通过 Sobel 算子增强垂直边缘
- 使用闭操作连接断裂的边缘
- 通过轮廓面积和长宽比筛选候选区域
2. 字符分割
垂直投影法实现步骤 :
- 对定位到的车牌区域进行灰度化 + 二值化
- 统计每一列白色像素点的数量
- 根据波峰波谷确定字符边界
// 计算垂直投影
vector<int> verticalProjection;
for (int col = 0; col < binary.cols; col++) {
int count = 0;
for (int row = 0; row < binary.rows; row++) {if (binary.at<uchar>(row, col) == 255) count++;
}
verticalProjection.push_back(count);
}
3. 字符识别
双策略并行方案 :
- 数字 / 字母:使用模板匹配(速度快)
- 汉字:SVM 分类器(准确率高)
// SVM 分类示例
Ptr<ml::SVM> svm = ml::SVM::load("chinese_model.xml");
Mat feature = extractHOGFeatures(charROI);
float result = svm->predict(feature);
完整代码结构
#include <opencv2/opencv.hpp>
using namespace cv;
class PlateRecognizer {
public:
void process(const string& imagePath) {Mat src = imread(imagePath);
Mat plateROI = locatePlate(src);
vector<Mat> chars = segmentChars(plateROI);
string result = recognizeChars(chars);
cout << "识别结果:" << result << endl;
}
private:
// 各步骤实现方法...
};
性能优化技巧
- 多尺度检测 :构建图像金字塔处理不同距离的车牌
- ROI 缓存 :对视频流连续帧复用定位结果
- 并行处理 :使用 OpenCV 的 parallel_for_加速字符识别
- 内存优化 :及时释放中间处理图像的 Mat 对象
避坑指南
常见问题解决方案 :
- 车牌倾斜 :通过 minAreaRect 获取旋转角度后矫正
- 字符断裂 :在二值化前使用顶帽操作增强对比度
- 误识别 :添加车牌规则校验(如省份简称 + 字母数字组合)
扩展思考
新能源车牌识别需要特别注意:
- 绿色背景与普通车牌的色域差异
- 8 位字符长度带来的分割挑战
- 小型新能源标识的检测
推荐改进方案:
- 增加绿色通道的颜色阈值
- 调整投影法的字符宽度预期
- 在识别阶段添加新能源标识分类
资源推荐
- 开源数据集:
- CCPD(中国车牌数据集)
- UFPR-ALPR(巴西车牌数据集)
- 扩展学习:
- OpenCV 官方文档
- 《学习 OpenCV 3》中文版
- 工具推荐:
- LabelImg 标注工具
- TensorBoard 模型分析
通过这个项目,我深刻体会到传统图像处理与机器学习的结合魅力。建议初学者先掌握 OpenCV 的基础操作,再逐步深入机器学习领域。车牌识别虽然是个老话题,但其中蕴含的计算机视觉基础技术永远不会过时。
正文完
