当前位置: 首页 > news >正文

毕设 基于机器视觉的车牌识别系统

文章目录

  • 0 简介
  • 1 课题介绍
    • 1.1 系统简介
    • 1.2 系统要求
    • 1.3 系统架构
  • 2 实现方式
    • 2.1 车牌检测技术
    • 2.2 车牌识别技术
    • 2.3 SVM识别字符
    • 2.4 最终效果
  • 3 系统使用说明
    • 实验环境
    • 输入
    • 输出
    • 系统结果演示
  • 4 对应论文
  • 5 最后

0 简介

今天学长向大家分享一个毕业设计项目

毕业设计 基于机器视觉的车牌识别系统

项目运行效果:

毕业设计 基于机器视觉的车牌识别系统

🧿 项目分享:见文末!

1 课题介绍

1.1 系统简介

车牌识别这个系统,虽然传统,古老,却是包含了所有这四个特侦的一个大数据技术的缩影.

在车牌识别中,你需要处理的数据是图像中海量的像素单元;你处理的数据不再是传统的结构化数据,而是图像这种复杂的数据;如果不能在很短的时间内识别出车牌,那么系统就缺少意义;虽然一副图像中有很多的信息,但可能仅仅只有那一小块的信息(车牌)以及车身的颜色是你关心,而且这些信息都蕴含着巨大的价值。也就是说,车牌识别系统事实上就是现在火热的大数据技术在某个领域的一个聚焦,通过了解车牌识别系统,可以很好的帮助你理解大数据技术的内涵,也能清楚的认识到大数据的价值。

1.2 系统要求

  • 它基于openCV这个开源库,这意味着所有它的代码都可以轻易的获取。
  • 它能够识别中文,例如车牌为苏EUK722的图片,它可以准确地输出std:string类型的"苏EUK722"的结果。
  • 它的识别率较高。目前情况下,字符识别已经可以达到90%以上的精度。

1.3 系统架构

整体包含两个系统:

  • 车牌检测
  • 车牌字体识别(中文 + 数字 + 英文)

整体架构如下:

2 实现方式

2.1 车牌检测技术

车牌检测(Plate Detection):

对一个包含车牌的图像进行分析,最终截取出只包含车牌的一个图块。这个步骤的主要目的是降低了在车牌识别过程中的计算量。如果直接对原始的图像进行车牌识别,会非常的慢,因此需要检测的过程。在本系统中,我们使用SVM(支持向量机)这个机器学习算法去判别截取的图块是否是真的“车牌”。

车牌检测这里不详细说明, 只贴出opencv图像处理流程, 需要代码的可以留下邮箱


使用到的图像处理算法

  • 高斯模糊
  • 灰度化处理
  • Sobel算子(边缘检测)
  • 开操作
  • 闭操作
  • 仿射变换
  • 霍姆线性检测
  • 角度矫正

2.2 车牌识别技术

字符识别(Chars Recognition):

有的书上也叫Plate Recognition,我为了与整个系统的名称做区分,所以改为此名字。这个步骤的主要目的就是从上一个车牌检测步骤中获取到的车牌图像,进行光学字符识别(OCR)这个过程。其中用到的机器学习算法是著名的人工神经网络(ANN)中的多层感知机(MLP)模型。最近一段时间非常火的“深度学习”其实就是多隐层的人工神经网络,与其有非常紧密的联系。通过了解光学字符识别(OCR)这个过程,也可以知晓深度学习所基于的人工神经网路技术的一些内容。

我们这里使用深度学习的方式来对车牌字符进行识别, 为什么不用传统的机器学习进行识别呢, 看图就知道了:

图2 深度学习(右)与PCA技术(左)的对比
可以看出深度学习对于数据的分类能力的优势。

这里博主使用生成对抗网络进行字符识别训练, 效果相当不错, 识别精度达到了98%

2.3 SVM识别字符

定义

classSVM(StatModel):def__init__(self,C=1,gamma=0.5):self.model=cv2.ml.SVM_create()self.model.setGamma(gamma)self.model.setC(C)self.model.setKernel(cv2.ml.SVM_RBF)self.model.setType(cv2.ml.SVM_C_SVC)#训练svmdeftrain(self,samples,responses):self.model.train(samples,cv2.ml.ROW_SAMPLE,responses)

调用方法,喂数据

deftrain_svm(self):#识别英文字母和数字self.model=SVM(C=1,gamma=0.5)#识别中文self.modelchinese=SVM(C=1,gamma=0.5)ifos.path.exists("svm.dat"):self.model.load("svm.dat")

训练,保存模型

else:chars_train=[]chars_label=[]forroot,dirs,filesinos.walk("train\\chars2"):iflen(os.path.basename(root))>1:continueroot_int=ord(os.path.basename(root))forfilenameinfiles:filepath=os.path.join(root,filename)digit_img=cv2.imread(filepath)digit_img=cv2.cvtColor(digit_img,cv2.COLOR_BGR2GRAY)chars_train.append(digit_img)#chars_label.append(1)chars_label.append(root_int)chars_train=list(map(deskew,chars_train))chars_train=preprocess_hog(chars_train)#chars_train = chars_train.reshape(-1, 20, 20).astype(np.float32)chars_label=np.array(chars_label)print(chars_train.shape)self.model.train(chars_train,chars_label)

车牌字符数据集如下


这些是字母的训练数据,同样的还有我们车牌的省份简写:

核心代码

predict_result=[]roi=Nonecard_color=Nonefori,colorinenumerate(colors):ifcolorin("blue","yello","green"):card_img=card_imgs[i]gray_img=cv2.cvtColor(card_img,cv2.COLOR_BGR2GRAY)#黄、绿车牌字符比背景暗、与蓝车牌刚好相反,所以黄、绿车牌需要反向ifcolor=="green"orcolor=="yello":gray_img=cv2.bitwise_not(gray_img)ret,gray_img=cv2.threshold(gray_img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)#查找水平直方图波峰x_histogram=np.sum(gray_img,axis=1)x_min=np.min(x_histogram)x_average=np.sum(x_histogram)/x_histogram.shape[0]x_threshold=(x_min+x_average)/2wave_peaks=find_waves(x_threshold,x_histogram)iflen(wave_peaks)==0:print("peak less 0:")continue#认为水平方向,最大的波峰为车牌区域wave=max(wave_peaks,key=lambdax:x[1]-x[0])gray_img=gray_img[wave[0]:wave[1]]#查找垂直直方图波峰row_num,col_num=gray_img.shape[:2]#去掉车牌上下边缘1个像素,避免白边影响阈值判断gray_img=gray_img[1:row_num-1]y_histogram=np.sum(gray_img,axis=0)y_min=np.min(y_histogram)y_average=np.sum(y_histogram)/y_histogram.shape[0]y_threshold=(y_min+y_average)/5#U和0要求阈值偏小,否则U和0会被分成两半wave_peaks=find_waves(y_threshold,y_histogram)#for wave in wave_peaks:# cv2.line(card_img, pt1=(wave[0], 5), pt2=(wave[1], 5), color=(0, 0, 255), thickness=2)#车牌字符数应大于6iflen(wave_peaks)<=6:print("peak less 1:",len(wave_peaks))continuewave=max(wave_peaks,key=lambdax:x[1]-x[0])max_wave_dis=wave[1]-wave[0]#判断是否是左侧车牌边缘ifwave_peaks[0][1]-wave_peaks[0][0]<max_wave_dis/3andwave_peaks[0][0]==0:wave_peaks.pop(0)#组合分离汉字cur_dis=0fori,waveinenumerate(wave_peaks):ifwave[1]-wave[0]+cur_dis>max_wave_dis*0.6:breakelse:cur_dis+=wave[1]-wave[0]ifi>0:wave=(wave_peaks[0][0],wave_peaks[i][1])wave_peaks=wave_peaks[i+1:]wave_peaks.insert(0,wave)#去除车牌上的分隔点point=wave_peaks[2]ifpoint[1]-point[0]<max_wave_dis/3:point_img=gray_img[:,point[0]:point[1]]ifnp.mean(point_img)<255/5:wave_peaks.pop(2)iflen(wave_peaks)<=6:print("peak less 2:",len(wave_peaks))continuepart_cards=seperate_card(gray_img,wave_peaks)fori,part_cardinenumerate(part_cards):#可能是固定车牌的铆钉ifnp.mean(part_card)<255/5:print("a point")continuepart_card_old=part_card w=abs(part_card.shape[1]-SZ)//2part_card=cv2.copyMakeBorder(part_card,0,0,w,w,cv2.BORDER_CONSTANT,value=[0,0,0])part_card=cv2.resize(part_card,(SZ,SZ),interpolation=cv2.INTER_AREA)#part_card = deskew(part_card)part_card=preprocess_hog([part_card])ifi==0:resp=self.modelchinese.predict(part_card)charactor=provinces[int(resp[0])-PROVINCE_START]else:resp=self.model.predict(part_card)charactor=chr(resp[0])#判断最后一个数是否是车牌边缘,假设车牌边缘被认为是1ifcharactor=="1"andi==len(part_cards)-1:ifpart_card_old.shape[0]/part_card_old.shape[1]>=7:#1太细,认为是边缘continuepredict_result.append(charactor)roi=card_img card_color=colorbreakreturnpredict_result,roi,card_color#识别到的字符、定位的车牌图像、车牌颜色

2.4 最终效果

3 系统使用说明

实验环境

实验环境为Python3.6,并安装了numpy、OpenCV、Pyqt5的包,CoreTM i5-5200UCPU @ 2.20 GH,4 GB RAM,操作系统为Windows 10,编程使用的工具是Pycharm和IDLE,编程语言为Python。

输入

读入车牌图像。

输出

输出车牌图像的名称,录入时间,车牌号码,车牌颜色类型,以及识别耗时和车牌归属地。

系统结果演示

本系统的功能按钮包括“导入文件”、“显示分割结果”和“导出数据”。其中“导入文件”是指从文件夹中选取需要识别的车牌图像,导入系统进行识别;“显示分割结果”的功能是将选中的图像的车牌区域分割为单个的字符图像;而“导出数据”是指将识别结果的列表以excel文件形式导出。系统界面如图所示。

如图,点击“打开文件”,然后从测试集中选中一张图片,点击“打开”。

系统以列表的形式展示了该车牌图像的识别结果,如图所示。

其中,系统界面的左下角为图片的车牌区域定位结果,界面右侧的列表显示了识别的结果,列表中的属性包括:图片名称、录入图片的具体时间、识别该图片花的时间、车牌号码、车牌颜色类型,以及车牌信息。识别结果的车牌号码为“京A·D77972”,归属地为北京。识别结果与图中的牌照号码一致。

点击“显示分割结果”,从测试集中导入图片,得到的分割结果如图所示。

点击“导出文件”,给即将导出的excel文档命名保存,系统提示“数据已保存”,如图所示。

打开保存好的excel文件,可以看到刚刚的识别结果以excel文档的形式储存完成,如图所示。

4 对应论文

5 最后

项目运行效果:

毕业设计 基于机器视觉的车牌识别系统

🧿 项目分享:见文末!

http://www.cnnetsun.cn/news/80782.html

相关文章:

  • R实现量子噪声通道模拟(从基础到高阶参数调优全指南)
  • 26岁中国博士生涉嫌破坏同学电脑被捕,教授:装隐蔽摄像头拍到...
  • 信息流广告是什么?信息流广告具有哪些特点呢?
  • 华为祭出百万级奖励,这些鸿蒙应用路子对了
  • Qwen命令行工具完全指南:从入门到高效使用技巧
  • 照片太多怎么办?Immich智能照片管理终极指南:轻松搞定自动回忆生成
  • 5分钟快速获取同济大学第七版线性代数教材 [特殊字符]
  • 1、24 小时学会 GIMP:安装与使用指南
  • 3、掌握GIMP基础工具,开启创意图形之旅
  • 如何快速扩展gofakeit:开发者的完整实践指南
  • ICCV 2025 | 强噪声去模糊天花板!残差引导策略 (RGS) 革新核估计,四大数据集上的全面领先
  • MLX转换终极指南:在Apple芯片上实现一键部署的完整教程
  • 实战指南:用Docker快速搭建专业级语音合成服务
  • 15个Obsidian效率提升的完整方案:让你的知识管理达到新高度
  • 一键部署:ZLMediaKit Windows服务化实战指南
  • Qwen-Image-Edit-Rapid-AIO V10终极指南:零基础快速上手指南
  • 从零开始掌握文本转SVG序列图的终极方案
  • 21、畅享数字视听:Linux系统的多媒体及外设应用指南
  • spotDL音频格式终极指南:6种格式深度解析与最佳选择
  • 阅宝黄金获授《黄金以旧换新经营服务规范》团体标准起草单位,以专业之力助推行业规范化发展
  • 制造业老师傅的工艺经验,可通过国产CAD软件系统化传承
  • PGModeler:让PostgreSQL数据库建模变得像搭积木一样简单
  • 游戏资源安全防护完整指南:从风险评估到系统化实施
  • Tsuru租户隔离架构深度解析:构建企业级安全PaaS平台
  • C++结构体完全指南:从基础到高级应用
  • 9、Samba配置全解析:从基础到实战
  • 技术为生命重启而来:脑虎科技发布“三全”脑机接口临床成功,以更优安全性与AI融合定义新未来
  • GoFakeIt扩展开发实战指南:打造专属测试数据工厂
  • OhMyZsh终端主题终极指南:从入门到精通的全方位配置方案
  • 当用户问‘哪品牌最好’时,你的名字为何未出现在AI回答中?长缨引擎解答迟迟没有出现在答案里 更别说被优先推荐了 是它们不够好吗 显然不一定 那原因出在哪这背后其实涉及一个正在快速成型的新规则——生成式