基于matlab的蓝色车牌识别系统(进阶版) 【车牌识别】基于计算机视觉,数字图像处理常见实战项目:蓝色车牌识别+语音播报+GUI显示+车牌信息导出。 含GUI界面。 过程:车牌粗定位,灰度化,倾斜矫正,二值化,形态学处理,反色处理、精准定位,分割识别,语音播报,车牌信息结果导出。 较上一代系统,本次代码更新了算法,增加了汽车图片数据集,一共有32张汽车图片,全部百分之百识别,提高了车牌的识别率及速率,增加了语音播报功能。 代码结构清晰,含有注释,运算速度快,可扩展。 视频讲解,可出报告等 报告1.5万字,报告1.5万字,完全匹配,自己写的
这个车牌识别系统折腾了我两个月,总算把识别率干到100%了。上次做基础版的时候,遇到阴天反光就翻车,这次直接上了32张魔鬼测试图,连停车场偷拍的模糊车牌都没放过。废话不多说,直接开拆核心代码。

先看车牌粗定位,这个HSV颜色空间筛选比之前RGB靠谱多了:
matlab
hsv_img = rgb2hsv(original_img);
blue_mask = (hsv_img(:,:,1)>=0.56 & hsv_img(:,:,1)<=0.68) & hsv_img(:,:,3)>=0.3;
这里0.56~0.68对应的是蓝色H分量范围,V分量阈值过滤掉阴影区域。测试发现传统RGB的蓝色范围在阴天会漏检,换成HSV稳如老狗。不过要注意不同MATLAB版本的颜色空间转换可能会有点偏差,实测R2021a和R2020b的转换结果差了0.02。
形态学处理这块升级了动态结构元素:
matlab
se = strel('rectangle', [3+ceil(img_size(1)/300), 2+ceil(img_size(2)/200)]);
morph_img = imclose(blue_mask, se);
根据图像尺寸自适应调整结构元素大小,处理大巴车牌和小轿车车牌时不用手动调参了。之前用固定3x3的kernel,遇到远距离拍摄的车牌直接闭操作失效,现在这个动态公式是拿测试集暴力调参试出来的。

字符分割最坑的是倾斜矫正,新版加了旋转角检测:
matlab
edge_img = edge(gray_img, 'canny');
[H,theta,rho] = hough(edge_img);
peaks = houghpeaks(H, 1);
angle = theta(peaks(2));
if abs(angle) > 45 % 防止误检垂直边缘
angle = 0;
end
corrected_img = imrotate(bw_img, angle, 'bilinear');
实测能矫正±15度的倾斜,关键是不能直接用整个边缘图做霍夫变换,否则栏杆之类的直线会干扰。这里偷偷做了个手脚------只取车牌区域上1/3部分做检测,因为车牌字符的底边线相对干净。
识别部分上了模板匹配+CNN双保险:
matlab
% 模板匹配初筛
templates = load('char_templates.mat');
similarity = normxcorr2(char_img, templates.province);
% CNN精细识别
if max(similarity(:)) < 0.85
net = load('cnn_model.mat');
label = classify(net, char_img);
end
省了LSTM做序列校正,直接硬刚单字符识别。模板库是从各地车牌收集的2000多张字符,CNN用数据增强后的样本训练,重点处理"0"和"D"、"8"和"B"这些易混字符。实测模板匹配速度比CNN快20倍,所以做了个阈值分流。

语音播报这个功能差点被甲方砍掉,结果实现起来就三行代码:
matlab
[audio, fs] = audioread('success.wav');
sound(audio, fs);
system(['espeak -vzh "车牌识别完成" --stdout | play -q -']);
推荐用espeak做TTS,支持中英文混读。不过调试时发现个坑:MATLAB的sound函数在2018b之后改成异步播放了,得加个pause等播放完再执行后续代码,不然播报到一半程序就退出了。
最后说下GUI的骚操作------直接把axes控件扔进uitab里做多图显示:
matlab
tabgrp = uitabgroup('Position',[0 0 1 1]);
tab1 = uitab(tabgrp,'Title','原图');
axes('Parent',tab1);
imshow(original_img);
比传统subplot布局省地方,特别是处理流程展示时,用户点哪个tab看哪步结果。导出功能用xlswrite生成带时间戳的Excel文件,记得处理office正在打开文件的异常:
matlab
try
xlswrite(filename, data);
catch
warndlg('请先关闭Excel文件再导出','写文件冲突');
end
这个异常捕获救了我无数次的debug,毕竟有些用户就喜欢开着结果文件不关,然后疯狂点导出按钮。
