基于Matlab的蓝色车牌识别系统(进阶版):车牌定位与识别技术实战

基于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,毕竟有些用户就喜欢开着结果文件不关,然后疯狂点导出按钮。

相关推荐
我在人间贩卖青春3 天前
Unix和Linux简史及标准化
linux·unix
齐鲁大虾5 天前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
wregjru5 天前
【操作系统】2.用户和权限
linux·服务器·unix
race condition10 天前
UNIX网络编程笔记 信号处理
笔记·unix·信号处理
李斯维12 天前
第18章 过滤器:统计和格式化
linux·bash·unix
2401_8582861112 天前
OS39.5.【Linux】分析ar命令生成的归档文件的格式
linux·ar·unix
Jack___Xue14 天前
LangChain实战快速入门笔记(六)--LangChain使用之Agent
笔记·langchain·unix
CloudJourney15 天前
从Unix到OpenEuler及其关键协议解析
服务器·unix
百年渔翁_肯肯15 天前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix
李斯维15 天前
第14 章 使用 shell:初始化文件
linux·bash·unix