python实现汽车车牌识别毕业设计
毕业设计基于python和opencv的车牌识别
毕业设计基于python和opencv的车牌识别摘要:本篇文章介绍了基于Python和OpenCV的车牌识别技术,并详细讨论了车牌识别系统的原理、实现步骤和效果评估。
通过该系统,可以准确地识别出图像中的车牌信息,实现了对车辆的自动监测和管理。
该系统具有较高的准确率和实用性,可以在实际场景中广泛应用。
1. 前言车牌识别技术是计算机视觉领域中的重要研究方向之一。
随着交通运输的发展和车辆数量的增加,对车辆的管理和监测需求日益增加。
传统的车牌识别方法需要大量的人工干预和复杂的算法,效果受到诸多因素的影响。
而基于Python和OpenCV的车牌识别技术能够更加高效、准确地实现车牌的自动识别,为车辆管理提供了更好的支持。
2. 车牌识别系统的原理车牌识别系统的原理基于图像处理和机器学习技术。
首先,通过摄像机获取车辆图像,并使用图像处理技术进行预处理。
对图像进行灰度化、二值化、图像增强等处理,以提高图像质量和车牌的辨识度。
然后,使用基于机器学习的方法对处理后的图像进行特征提取和分类。
通过训练模型,将车牌区域与其他区域进行区分,并提取出车牌的特征信息。
最后,通过字符分割和字符识别技术对车牌上的字符进行提取和识别。
车牌识别系统的准确性取决于算法的优化和模型的训练效果。
3. 车牌识别系统的实现步骤基于Python和OpenCV的车牌识别系统的实现步骤分为图像预处理、特征提取与分类、字符分割和字符识别四个主要步骤。
3.1 图像预处理首先,将获取的车辆图像转换为灰度图像,并对其进行二值化处理。
通过设定合适的阈值,将车牌区域与其他区域进行区分。
然后,进行图像增强处理,包括对比度调整、边缘增强等,以提高车牌的辨识度。
最后,使用形态学操作对图像进行开运算和闭运算,去除噪声和细小的干扰。
3.2 特征提取与分类在图像预处理之后,需要对处理后的图像进行特征提取和分类。
可以使用机器学习算法,如支持向量机(SVM)、卷积神经网络(CNN)等,对车牌区域与其他区域进行分类。
python车辆识别的解决方案
Python车辆识别的解决方案随着人工智能和计算机视觉技术的发展,车辆识别已经不再是一项难以实现的技术了。
Python作为一种高级编程语言,因为其易学易用的特点,被广泛应用于车辆识别领域。
本文将介绍Python实现车辆识别的解决方案。
车辆识别的基本原理车辆识别的基本原理是通过计算机视觉技术来识别图片或视频中的车辆。
其主要通过以下几步实现:1.图像采集:使用摄像机或其他设备采集图片或视频;2.图像预处理:对采集的图片或视频进行处理,主要是对图像进行预处理和增强,提高识别质量;3.特征提取:识别图像中与车辆相关的特征,如车辆的轮廓、颜色等;4.分类器训练:使用机器学习算法对车辆的特征进行分类,训练出分类模型;5.车辆识别:使用分类模型对新的图片或视频进行车辆识别。
Python实现车辆识别的方法OpenCVOpenCV(Open Source Computer Vision Library)是一种开源计算机视觉库,用于实现计算机视觉处理。
它支持多种语言,包括C++、Python等。
使用OpenCV 可以实现车辆识别,其主要步骤如下:1.图像读取:使用OpenCV读取图片或视频;2.图像预处理:使用OpenCV对读取的图片或视频进行预处理和增强;3.车辆检测:使用OpenCV提供的Cascade分类器进行车辆检测;4.车辆识别:使用分类模型对检测到的车辆进行识别。
TensorFlowTensorFlow是一种开源的人工智能框架,用于实现机器学习和深度学习等领域。
使用TensorFlow可以实现车辆识别,主要步骤如下:1.图像读取:使用Python读取图片或视频;2.图像预处理:对读取的图片或视频进行预处理和增强;3.特征提取:使用卷积神经网络(CNN)等深度学习模型对图片或视频中的车辆进行特征提取;4.分类器训练:使用机器学习算法对车辆的特征进行分类,训练出分类模型;5.车辆识别:使用分类模型对新的图片或视频进行车辆识别。
车牌识别毕业设计论文
车牌识别毕业设计论文车牌识别是一项实用的技术,已广泛应用于交通管理、安全监控和智能导航等领域。
本毕业设计旨在研究和实现一种高效准确的车牌识别系统,通过图像处理和模式识别的方法,实现车牌的自动检测、字符分割和识别。
在车牌识别系统中,图像处理是最关键的环节之一、首先,需要对图像进行预处理,包括二值化、滤波和去噪等操作,以提高后续处理的准确性。
然后,通过边缘检测和形态学操作,可以实现车牌的自动检测。
通过比较不同车牌的特征,可以找到最佳的车牌位置。
在车牌的字符分割过程中,一般采用基于垂直和水平投影的方法。
首先,通过垂直投影,可以得到每个字符的位置和宽度。
然后,通过水平投影,可以得到字符的高度和行间距。
通过这些信息,可以将车牌字符逐个分割出来,为后续的字符识别提供准备。
字符识别是车牌识别系统的最后一步,也是最复杂的一步。
常用的方法包括基于模板匹配和基于机器学习的方法。
在模板匹配中,需要提前准备一组字符模板,并将待识别的字符与模板进行比较,找出最佳匹配的字符。
在机器学习方法中,常用的算法包括支持向量机(SVM)和深度学习等,通过训练大量的样本数据,建立一个分类模型,实现字符的自动识别。
在实际应用中,车牌识别系统还需要考虑到诸多因素,如车牌大小的变化、光线条件的差异和图像角度的旋转等。
为了提高系统的鲁棒性,可以采用自适应阈值处理、学习算法和特征提取等技术手段。
通过本毕业设计,可以深入了解车牌识别的原理和实现方法,并通过实验验证其准确性和效率。
此外,还可以进一步优化和改进车牌识别系统,以提高其性能和适应性。
python车型识别代码
python车型识别代码车型识别代码是用于识别和区分不同车辆型号的一组字符或数字。
在 Python 中,可以使用正则表达式或字符串处理方法来提取、解析和识别车型识别代码。
下面是一个示例代码,演示如何使用正则表达式来识别车型识别代码:```pythonimport redef extract_vehicle_identification_code(vehicle_description):# 定义车型识别代码的正则表达式模式pattern = r'[A-Za-z0-9]{3,7}'# 使用正则表达式在车辆描述中查找匹配的车型识别代码match = re.search(pattern, vehicle_description)if match:vehicle_identification_code = match.group()return vehicle_identification_codeelse:return None# 示例车辆描述vehicle_description = "这是一辆红色的丰田凯美瑞,车型识别代码是JTDBE32K500000111。
"# 提取车型识别代码vehicle_identification_code = extract_vehicle_identification_code(vehicle_description)if vehicle_identification_code:print("车型识别代码:", vehicle_identification_code)else:print("未找到车型识别代码")```在上述示例中,我们定义了一个`extract_vehicle_identification_code`函数,它接受一个车辆描述字符串作为输入。
函数使用正则表达式模式来匹配车型识别代码,并使用`re.search`方法在车辆描述中查找匹配的代码。
基于Python实现的车牌识别项目
基于Python实现的车牌识别项⽬车牌识别在⾼速公路中有着⼴泛的应⽤,⽐如我们常见的电⼦收费(ETC)系统和交通违章车辆的检测,除此之外像⼩区或地下车库门禁也会⽤到,基本上凡是需要对车辆进⾏⾝份检测的地⽅都会⽤到。
简介车牌识别系统(Vehicle License Plate Recognition)是计算机视频图像识别技术在车辆牌照识别中的⼀种应⽤,通常⼀个车牌识别系统主要包括以下这四个部分:车辆图像获取车牌定位车牌字符分割车牌字符识别我们再来看⼀下百科中对车牌识别技术的描述:车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,通过车牌提取、图像预处理、特征提取、车牌字符识别等技术,识别车辆牌号、颜⾊等信息,⽬前最新的技术⽔平为字母和数字的识别率可达到 99.7%,汉字的识别率可达到99%。
实现⽅式我们这⾥不做太复杂的车辆动态识别,只演⽰从图像中识别车牌信息,车牌识别功能的实现⽅式⼤致分为两种,⼀种是⾃⼰编写代码实现,另⼀种是借助第三⽅ API 接⼝实现。
⾃⼰实现如果我们想要通过 Python ⾃⼰⼿动编码实现车牌识别功能,可以借助⼀些 Python 库,⽐如:OpenCV、TensorFlow 等,这种⽅式因为每⼀个功能点都需要我们⾃⼰编码实现,所有会相对复杂⼀些,另⼀⽅⾯如果我们想要保证识别的准确性,可能需要做⼤量的实验,也就是说会花费更多的时间。
第三⽅接⼝现在已经有⼀些第三⽅平台实现好了车牌识别的功能,并且他们对外提供了 API 接⼝,我们只需要调⽤他们提供的接⼝即可,这种⽅式实现就相对简单了⼀些,并且通常接⼝提供⽅对外提供的接⼝功能的准确性也是基本可以保证的,原因很简单,如果接⼝功能太差的话,⼀是⾃⼰打脸,还有就是基本不会有什么⼈使⽤,也就失去了接⼝对外提供的价值了,另外第三⽅接⼝可能会收取⼀定费⽤,因此,如果现实中我们具体实现的话要综合考虑。
具体实现SDK 安装百度云 SDK 对多种语⾔提供了⽀持,⽐如:Python、Java、C++、IOS、Android 等,这⾥我们安装 Python 版的 SDK,安装很简单,使⽤pip install baidu-aip命令即可。
基于python的车牌识别系统设计原理
基于python的车牌识别系统设计原理
车牌识别系统通常包括车辆检测、车牌定位和字符分割等主要步骤。
以下是一个基于Python的车牌识别系统的设计原理:
1. 车辆检测:这一步通常采用视频检测技术,通过在视频流中检测移动物体(如车辆)来实现。
常用的方法包括埋地线圈检测、红外检测、雷达检测和视频检测等。
视频检测技术具有不破坏路面、不需附加外部检测设备、不需矫正触发位置以及适合移动式、便携式应用等优点。
在进行视频车辆检测时,需要具备很高的处理速度并采用优秀的算法,在基本不丢帧的情况下实现图像采集、处理。
2. 车牌定位:在检测到车辆后,系统需要在图像中准确地定位车牌区域。
由于汽车图像背景复杂、光照不均匀,这一步是整个识别过程的关键。
常用的方法包括基于颜色、边缘、纹理等特征的分割方法,以及基于深度学习的目标检测方法(如YOLO、SSD等)。
3. 字符分割:在完成牌照区域的定位后,需要将牌照区域分割成单个字符。
这一步通常采用垂直投影法或水平投影法,根据车牌字符的宽度和间距进行分割。
4. 字符识别:最后,系统需要对分割后的字符进行识别。
常用的方法包括模板匹配法和深度学习方法。
模板匹配法是将分割后的字符与预定义的模板进
行比对,找到最相似的模板作为识别结果。
深度学习方法则是通过训练深度神经网络进行字符识别。
基于Python的车牌识别系统可以使用OpenCV、Pytorch等开源库来实现上述步骤。
在实际应用中,还需要考虑如何提高系统的鲁棒性和准确性,例如通过调整算法参数、训练更复杂的模型等方法来实现。
车牌识别系统毕业设计
车牌识别系统毕业设计车牌识别系统是一种基于计算机视觉领域的技术,通过对车辆的图像进行特征提取和模式识别,自动识别车牌号码。
车牌识别系统在交通管理、停车场管理、车辆信息记录等方面具有广泛应用,因此在毕业设计中选择车牌识别系统作为课题是非常具有实际意义的。
首先,系统需要对车辆图像进行预处理,以去除图像中的噪声和干扰。
常用的预处理方法包括图像灰度化、二值化、中值滤波、边缘检测等。
这些预处理方法可以提高车牌的辨识率和识别准确性。
其次,车牌定位是车牌识别系统的重要环节。
车牌定位可以通过图像边缘检测、颜色特征提取等方法来实现。
在车牌定位过程中,需要考虑车辆在图像中的位置、角度和尺寸等因素,以确保定位到正确的车牌区域。
然后,字符分割是指将车牌图像中的字符分割为单个字符,为后续的字符识别做准备。
字符分割可以通过图像灰度投影、边缘连接等方式来实现。
在字符分割中,需要考虑字符之间的距离、重叠、形状等因素,以确保正确的分割结果。
最后,字符识别是车牌识别系统的核心环节。
字符识别可以通过模板匹配、特征提取、神经网络等方式来实现。
在字符识别过程中,需要考虑字符的大小、形状、字体等因素,以确保识别的准确性和鲁棒性。
除了以上的核心步骤,车牌识别系统还可以进行车牌类型判断、车牌颜色识别、车辆特征提取等功能的开发。
通过这些功能的实现,可以提高车牌的识别准确度和系统的实用性。
在实际的毕业设计中,可以选择使用编程语言(如Python、C++等)和图像处理库(如OpenCV)来实现车牌识别系统。
根据设计需求,可以选择合适的算法和模型,进行系统的设计和开发。
同时,还可以进行实验和测试,验证系统的性能和可靠性。
总之,车牌识别系统是一项具有广泛应用的技术,对交通管理和车辆信息记录等方面具有重要意义。
通过系统的设计和开发,可以提高车牌识别的准确性和效率,为交通运输行业提供更加智能化和便捷的服务。
车牌识别系统毕业设计
车牌识别系统毕业设计车牌识别系统毕业设计一、引言车牌识别系统是一种利用计算机视觉技术,通过对车辆的车牌进行图像处理和识别,实现自动化识别和管理的系统。
随着城市交通的快速发展和车辆数量的不断增加,传统的人工车牌识别方式已经无法满足实际需求,因此开发一种高效、准确的车牌识别系统具有重要意义。
二、系统设计1. 系统架构车牌识别系统主要由图像采集、图像处理、车牌定位、字符识别和结果输出等模块组成。
图像采集模块负责获取车辆的图像信息,图像处理模块对采集到的图像进行预处理,车牌定位模块用于定位车牌在图像中的位置,字符识别模块将车牌中的字符进行识别,最后将识别结果输出。
2. 图像采集图像采集是车牌识别系统的第一步,常用的图像采集设备包括摄像头和摄像机。
在设计车牌识别系统时,需要选择合适的图像采集设备,并考虑到光线、角度和距离等因素对图像质量的影响。
3. 图像处理图像处理是车牌识别系统的核心环节,它包括图像增强、图像滤波、图像分割等步骤。
通过对图像进行处理,可以提高车牌边缘的清晰度,减少噪声的干扰,为后续的车牌定位和字符识别提供更好的条件。
4. 车牌定位车牌定位是车牌识别系统的关键步骤,它通过对图像进行分析和处理,确定车牌在图像中的位置和大小。
常用的车牌定位算法包括基于颜色特征的方法、基于边缘特征的方法和基于形状特征的方法等。
5. 字符识别字符识别是车牌识别系统的最后一步,它通过对车牌中的字符进行分割和识别,得到车牌的具体信息。
字符识别的方法主要包括基于模板匹配的方法、基于特征提取的方法和基于神经网络的方法等。
三、系统实现1. 硬件平台车牌识别系统的硬件平台主要包括计算机、摄像头和显示设备等。
计算机需要具备较高的处理能力和存储空间,以满足图像处理和字符识别的需求。
2. 软件平台车牌识别系统的软件平台主要包括操作系统、图像处理库和字符识别算法库等。
操作系统可以选择Windows、Linux等,图像处理库可以选择OpenCV、Matlab 等,字符识别算法库可以选择Tesseract、OCR等。
Python期末课程设计车牌识别
Python期末课程设计车牌识别一、教学目标本章节的教学目标是让学生掌握Python期末课程设计车牌识别的基本原理和方法,培养学生运用Python编程解决实际问题的能力。
具体分为以下三个部分:1.知识目标:使学生了解车牌识别技术的基本原理,理解Python编程中与车牌识别相关的关键技术,如图像处理、字符识别等。
2.技能目标:通过课程学习,使学生能够熟练使用Python编程语言进行车牌识别程序的设计与实现,提高学生的编程能力和问题解决能力。
3.情感态度价值观目标:培养学生对科技创新的兴趣,激发学生积极参与科技创新的热情,培养学生的团队合作意识和责任感。
二、教学内容本章节的教学内容主要包括以下几个部分:1.车牌识别技术概述:介绍车牌识别技术的基本原理、发展历程和应用领域。
2.Python编程基础:回顾Python编程语言的基本语法和常用库,为学生顺利进行车牌识别程序设计打下基础。
3.图像处理技术:讲解图像处理的基本方法,如图像读取、图像滤波、边缘检测等,培养学生运用图像处理技术进行车牌识别的能力。
4.字符识别技术:介绍字符识别的基本方法,如模板匹配、深度学习等,使学生能够运用字符识别技术完成车牌号码的识别。
5.车牌识别系统设计:引导学生结合所学知识,设计并实现一个车牌识别系统,提高学生解决实际问题的能力。
三、教学方法为了达到本章节的教学目标,将采用以下几种教学方法:1.讲授法:通过讲解车牌识别技术的基本原理和关键技术,使学生掌握相关知识。
2.案例分析法:分析实际案例,让学生了解车牌识别技术在现实生活中的应用,提高学生的学习兴趣。
3.实验法:引导学生动手实践,设计并实现一个车牌识别系统,培养学生的实际操作能力和问题解决能力。
4.讨论法:学生进行小组讨论,分享学习心得和经验,促进学生之间的交流与合作。
四、教学资源为了支持本章节的教学内容和教学方法,将准备以下教学资源:1.教材:选用适合学生程度的Python编程教材,为学生提供系统性的学习资料。
基于python 的车牌识别
添加 标题
添加 标题
Python车牌识别技术是一种基于计算机视觉 和图像处理技术的自动化识别技术,其核心 是利用图像处理算法对车牌图像进行预处理, 包括灰度化、二值化、去噪等操作,以提高 图像质量,便于后续的车牌分割和识别。
停车场管理
车辆进出管理:通过车牌识别技术,实现车辆的快速进出和记录 停车位管理:实时监测车位状态,自动分配空闲车位 停车费用结算:根据车辆停放时间和车位类型计算停车费用 异常情况处理:对异常停车行为进行监控和报警
其他应用场景
智能交通管理: 通过车牌识别 技术,可以实 时监测道路交 通情况,提高 交通管理效率。
丰富的库: Python语言拥 有丰富的库,可 以方便地实现各 种图像处理和机 器学习算法,提 高了车牌识别的 准确性和效率。
缺点
识别速度:相对于其 他技术,Python车 牌识别技术的识别速 度可能较慢
准确性:受限于图像 质量、车牌污损等因 素,Python车牌识 别技术的准确性可能 有所下降
稳定性:在复杂环境 下,Python车牌识 别技术的稳定性可能 受到影响
等
分类识别:利 用机器学习算 法对字符进行
分类和识别
Python车牌识别 技术的优缺点
优点
高效性: Python语言具 有高效的处理能 力,能够快速地 识别车牌。
易用性: Python语言易 于学习和使用, 降低了车牌识别 技术的门槛。
跨平台性: Python语言具 有跨平台性,可 以在不同的操作 系统上运行,方 便了车牌识别技 术的应用。
适用范围:Python 车牌识别技术主要适 用于静态图像或视频, 对于实时监控等应用 场景可能存在限制
基于Python的智能车辆识别系统设计与实现
基于Python的智能车辆识别系统设计与实现智能车辆识别系统是一种基于人工智能技术的应用系统,通过对车辆进行图像识别和数据处理,实现对车辆的自动识别和分类。
本文将介绍如何利用Python语言设计和实现一个智能车辆识别系统,包括系统架构设计、数据采集与预处理、模型训练与优化以及系统部署等内容。
1. 系统架构设计智能车辆识别系统的架构设计是整个系统开发的基础,一个合理的架构设计可以提高系统的性能和可扩展性。
在本文中,我们采用了以下系统架构:数据采集模块:负责从摄像头或视频流中采集车辆图像数据。
数据预处理模块:对采集到的图像数据进行预处理,包括图像增强、尺寸调整等操作。
特征提取模块:使用卷积神经网络(CNN)等方法提取图像特征。
车辆识别模块:通过训练好的模型对提取到的特征进行分类,实现车辆的识别。
2. 数据采集与预处理在智能车辆识别系统中,数据的质量对系统性能有着重要影响。
我们可以通过摄像头或者视频流来采集车辆图像数据,并对数据进行预处理,包括去除噪声、调整亮度和对比度、裁剪图像等操作。
Python中有丰富的图像处理库(如OpenCV)可以帮助我们完成这些任务。
3. 模型训练与优化在车辆识别系统中,通常会使用深度学习模型来实现对车辆的识别。
我们可以选择使用已经训练好的模型进行迁移学习,也可以根据自己的需求设计和训练新的模型。
在Python中,有很多深度学习框架(如TensorFlow、PyTorch)可以帮助我们进行模型训练和优化。
在模型训练过程中,我们需要注意调整超参数、选择合适的损失函数和优化器,并进行模型评估和调优,以提高模型的准确率和泛化能力。
4. 系统部署完成模型训练后,我们需要将训练好的模型部署到实际应用中。
可以将模型集成到一个Web应用程序中,通过前端界面上传车辆图像并实时进行识别;也可以将模型部署到嵌入式设备上,实现实时车辆识别功能。
Python提供了丰富的库和框架(如Flask、Django)来帮助我们快速搭建Web应用程序,并且支持将深度学习模型集成到应用中。
基于Python的智能车辆识别与跟踪系统设计与实现
基于Python的智能车辆识别与跟踪系统设计与实现智能车辆识别与跟踪系统是近年来人工智能技术在交通领域的重要应用之一。
通过结合计算机视觉和深度学习技术,可以实现对道路上车辆的自动识别和跟踪,为交通管理、智慧城市建设等领域提供重要支持。
本文将介绍基于Python的智能车辆识别与跟踪系统的设计与实现过程。
1. 系统架构设计智能车辆识别与跟踪系统的核心是图像处理和目标检测算法。
系统架构主要包括以下几个模块:1.1 数据采集模块数据采集模块负责从摄像头或视频文件中获取图像数据,作为后续处理的输入。
在实际应用中,可以使用USB摄像头、监控摄像头等设备进行数据采集。
1.2 车辆识别模块车辆识别模块利用深度学习技术对图像中的车辆进行识别。
常用的算法包括卷积神经网络(CNN)和目标检测算法(如YOLO、Faster R-CNN等)。
通过训练模型,可以实现对不同类型车辆的准确识别。
1.3 车辆跟踪模块车辆跟踪模块基于目标检测结果,利用相关滤波器、卡尔曼滤波器等算法对车辆进行跟踪。
通过建立目标运动模型,可以实现对车辆在连续帧中的跟踪和预测。
1.4 结果展示模块结果展示模块将识别和跟踪结果可视化展示,通常以图像或视频的形式呈现。
可以在图像上标注识别结果,并实时显示车辆的跟踪轨迹。
2. 算法实现与优化2.1 Python编程环境搭建Python是一种功能强大且易于学习的编程语言,广泛应用于机器学习和深度学习领域。
搭建Python编程环境是开发智能车辆识别与跟踪系统的第一步,可以选择安装Anaconda集成环境,以及OpenCV、TensorFlow等相关库。
2.2 目标检测算法实现选择适合的目标检测算法对车辆进行识别是系统设计的关键。
可以基于已有的开源模型进行迁移学习,也可以根据具体需求自行设计网络结构。
在训练过程中需要注意数据集的质量和数量,以及调整超参数进行优化。
2.3 车辆跟踪算法实现车辆跟踪算法需要考虑目标运动模型、外观特征匹配等因素。
基于python的车牌识别步骤
基于python的车牌识别步骤
基于Python的车牌识别步骤通常包括以下几个步骤:
1. 图像预处理:首先加载测试图像,并进行图像预处理操作,例如灰度化、降噪、图像平滑、二值化等。
这些操作可以帮助提高车牌识别的准确性和鲁棒性。
2. 车牌定位:使用图像处理算法,通过车牌的颜色、纹理等特征,将车牌从整个图像中定位出来。
常用的方法包括基于边缘检测、形态学变换等。
3. 字符分割:将车牌中的字符分割出来,形成单独的字符图像。
这一步骤通常使用基于连通区域的图像分割算法,例如基于连通分量、轮廓等。
4. 字符识别:对于每个字符图像,使用机器学习、深度学习等方法进行字符识别。
常用的方法包括基于传统的特征提取和分类器的方法,以及基于深度学习的方法,如卷积神经网络(CNN)等。
5. 组合字符:将识别出的单个字符进行组合,形成完整的车牌识别结果。
根据不同的车牌类型和字符布局,可以使用基于规则的方法或者基于机器学习的方法进行组合。
6. 结果输出:根据实际需要,将车牌识别结果输出为文本、图像或其他格式。
可以将结果保存到文件,或者通过网络接口等方式进行实时输出。
以上是基于Python的车牌识别的一般步骤,实际应用中可能还需要进行参数调优、模型训练
和评估等步骤。
具体的实现方法可以根据具体情况进行选择和调整。
详细过程带你用Python做车牌自动识别系统
详细过程带你⽤Python做车牌⾃动识别系统⽬录前⾔⼀、核⼼功能设计UI设计排版布局车牌识别车牌信息显⽰存储⼆、实现步骤1. UI设计排版布局2. 车牌识别3. 车牌信息显⽰存储3.1 车牌信息显⽰:3.2 信息导出存储:前⾔前段时间,⽤PyQt5写了两篇⽂章,、。
有粉丝问我,为什么要⽤PyQt5?之前没接触过PyQt5,能不能多分享⼀些这⽅⾯的开发案例?今天就继续给⼤家分享⼀个实战案例,带⼤家⼀起⽤Python的PyQt5开发⼀个车牌⾃动识别系统!⾸先⼀起来看看最终实现的车牌识别系统效果图:下⾯,我们就开始介绍如何实现这款⾃动车牌识别系统。
⼀、核⼼功能设计总体来说,我们⾸先要进⾏UI界⾯构建设计,根据车牌识别系统功能进⾏画⾯排版布局;其次我们的这款车牌识别系统的主要功能车辆图⽚读取识别显⽰、图⽚中车牌ROI区域获取、车牌识别结果输出显⽰。
对于结果输出显⽰,我们主要包含了读取图⽚名称、读取录⼊时间、识别车牌号码、识别车牌颜⾊、识别车牌所属地。
最后我们还可以将车牌识别系统的数据信息导出本地存储。
拆解需求,⼤致可以整理出核⼼功能如下:UI设计排版布局左侧区域进⾏识别信息显⽰,包含图⽚名称、读取录⼊时间、识别车牌号码、识别车牌颜⾊、识别车牌所属地信息右侧可以分成3个区域,顶部区域包含窗体最⼩化,最⼤化,关闭功能;中间区域显⽰读取车辆图⽚;底部区域包含车牌显⽰区域、图⽚读取、车牌信息存储功能车牌识别通过读取图⽚进⾏车牌区域提取输出车牌⾃动识别结果输出车牌信息显⽰存储根据⾃动识别结果对车牌各类信息显⽰对录⼊识别的车辆车牌识别信息存储⼆、实现步骤1. UI设计排版布局根据车牌识别需要的功能,⾸先进⾏UI布局设计,我们这次还是使⽤的pyqt5。
核⼼设计代码如下:# author:CSDN-Dragon少年def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(1213, 670)MainWindow.setFixedSize(1213, 670) # 设置窗体固定⼤⼩MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)self.scrollArea.setGeometry(QtCore.QRect(690, 40, 511, 460))self.scrollArea.setWidgetResizable(True)self.scrollArea.setObjectName("scrollArea")self.scrollAreaWidgetContents = QtWidgets.QWidget()self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 500, 489))self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")bel_0 = QtWidgets.QLabel(self.scrollAreaWidgetContents)bel_0.setGeometry(QtCore.QRect(10, 10, 111, 20))font = QtGui.QFont()font.setPointSize(11)bel_0.setFont(font)bel_0.setObjectName("label_0")bel = QtWidgets.QLabel(self.scrollAreaWidgetContents)bel.setGeometry(QtCore.QRect(10, 40, 481, 420))bel.setObjectName("label")bel.setAlignment(Qt.AlignCenter)self.scrollArea.setWidget(self.scrollAreaWidgetContents)self.scrollArea_2 = QtWidgets.QScrollArea(self.centralwidget)self.scrollArea_2.setGeometry(QtCore.QRect(10, 10, 671, 631))self.scrollArea_2.setWidgetResizable(True)self.scrollArea_2.setObjectName("scrollArea_2")self.scrollAreaWidgetContents_1 = QtWidgets.QWidget()self.scrollAreaWidgetContents_1.setGeometry(QtCore.QRect(0, 0, 669, 629))self.scrollAreaWidgetContents_1.setObjectName("scrollAreaWidgetContents_1")bel_1 = QtWidgets.QLabel(self.scrollAreaWidgetContents_1)bel_1.setGeometry(QtCore.QRect(10, 10, 111, 20))font = QtGui.QFont()font.setPointSize(11)bel_1.setFont(font)bel_1.setObjectName("label_1")self.tableWidget = QtWidgets.QTableWidget(self.scrollAreaWidgetContents_1)self.tableWidget.setGeometry(QtCore.QRect(10, 40, 651, 581)) # 581))self.tableWidget.setObjectName("tableWidget")self.tableWidget.setColumnCount(5)self.tableWidget.setColumnWidth(0, 140) # 设置1列的宽度self.tableWidget.setColumnWidth(1, 130) # 设置2列的宽度self.tableWidget.setColumnWidth(2, 110) # 设置3列的宽度self.tableWidget.setColumnWidth(3, 90) # 设置4列的宽度self.tableWidget.setColumnWidth(4, 181) # 设置5列的宽度self.tableWidget.setHorizontalHeaderLabels(["图⽚名称", "录⼊时间", "车牌号码", "车牌类型", "车牌信息"])self.tableWidget.setRowCount(self.RowLength)self.tableWidget.verticalHeader().setVisible(False) # 隐藏垂直表头)self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)self.tableWidget.raise_()self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_1)self.scrollArea_3 = QtWidgets.QScrollArea(self.centralwidget)self.scrollArea_3.setGeometry(QtCore.QRect(690, 510, 341, 131))self.scrollArea_3.setWidgetResizable(True)self.scrollArea_3.setObjectName("scrollArea_3")self.scrollAreaWidgetContents_3 = QtWidgets.QWidget()self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 339, 129))self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3")bel_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)bel_2.setGeometry(QtCore.QRect(10, 10, 111, 20))font = QtGui.QFont()font.setPointSize(11)bel_2.setFont(font)bel_2.setObjectName("label_2")bel_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)bel_3.setGeometry(QtCore.QRect(10, 40, 321, 81))bel_3.setObjectName("label_3")self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3)self.scrollArea_4 = QtWidgets.QScrollArea(self.centralwidget)self.scrollArea_4.setGeometry(QtCore.QRect(1040, 510, 161, 131))self.scrollArea_4.setWidgetResizable(True)self.scrollArea_4.setObjectName("scrollArea_4")self.scrollAreaWidgetContents_4 = QtWidgets.QWidget()self.scrollAreaWidgetContents_4.setGeometry(QtCore.QRect(0, 0, 159, 129))self.scrollAreaWidgetContents_4.setObjectName("scrollAreaWidgetContents_4")self.pushButton_2 = QtWidgets.QPushButton(self.scrollAreaWidgetContents_4)self.pushButton_2.setGeometry(QtCore.QRect(20, 50, 121, 31))self.pushButton_2.setObjectName("pushButton_2")self.pushButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents_4)self.pushButton.setGeometry(QtCore.QRect(20, 90, 121, 31))self.pushButton.setObjectName("pushButton")bel_4 = QtWidgets.QLabel(self.scrollAreaWidgetContents_4)bel_4.setGeometry(QtCore.QRect(10, 10, 111, 20))font = QtGui.QFont()font.setPointSize(11)bel_4.setFont(font)bel_4.setObjectName("label_4")self.scrollArea_4.setWidget(self.scrollAreaWidgetContents_4)MainWindow.setCentralWidget(self.centralwidget)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)self.pushButton.clicked.connect(self.__openimage) # 设置点击事件self.pushButton.setStyleSheet('''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#2B2B2B;}''') self.pushButton_2.clicked.connect(self.__writeFiles) # 设置点击事件self.pushButton_2.setStyleSheet('''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#2B2B2B;}''') self.retranslateUi(MainWindow)self.close_widget = QtWidgets.QWidget(self.centralwidget)self.close_widget.setGeometry(QtCore.QRect(1130, 0, 90, 50))self.close_widget.setObjectName("close_widget")self.close_layout = QGridLayout() # 创建左侧部件的⽹格布局层self.close_widget.setLayout(self.close_layout) # 设置左侧部件布局为⽹格self.left_close = QPushButton("") # 关闭按钮self.left_close.clicked.connect(self.close)self.left_visit = QPushButton("") # 空⽩按钮self.left_visit.clicked.connect(MainWindow.big)self.left_mini = QPushButton("") # 最⼩化按钮self.left_mini.clicked.connect(MainWindow.mini)self.close_layout.addWidget(self.left_mini, 0, 0, 1, 1)self.close_layout.addWidget(self.left_close, 0, 2, 1, 1)self.close_layout.addWidget(self.left_visit, 0, 1, 1, 1)self.left_close.setFixedSize(15, 15) # 设置关闭按钮的⼤⼩self.left_visit.setFixedSize(15, 15) # 设置按钮⼤⼩self.left_mini.setFixedSize(15, 15) # 设置最⼩化按钮⼤⼩self.left_close.setStyleSheet('''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''')self.left_visit.setStyleSheet('''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''')self.left_mini.setStyleSheet('''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''')QtCore.QMetaObject.connectSlotsByName(MainWindow)self.ProjectPath = os.getcwd() # 获取当前⼯程⽂件位置self.scrollAreaWidgetContents.setStyleSheet(sc)self.scrollAreaWidgetContents_3.setStyleSheet(sc)self.scrollAreaWidgetContents_4.setStyleSheet(sc)b = '''color:white;background:#2B2B2B;'''bel_0.setStyleSheet(b)bel_1.setStyleSheet(b)bel_2.setStyleSheet(b)bel_3.setStyleSheet(b)MainWindow.setWindowOpacity(0.95) # 设置窗⼝透明度MainWindow.setAttribute(Qt.WA_TranslucentBackground)MainWindow.setWindowFlag(Qt.FramelessWindowHint) # 隐藏边框# author:CSDN-Dragon少年def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "车牌识别系统"))bel_0.setText(_translate("MainWindow", "原始图⽚:"))bel.setText(_translate("MainWindow", ""))bel_1.setText(_translate("MainWindow", "识别结果:"))bel_2.setText(_translate("MainWindow", "车牌区域:"))bel_3.setText(_translate("MainWindow", ""))self.pushButton.setText(_translate("MainWindow", "打开⽂件"))self.pushButton_2.setText(_translate("MainWindow", "导出数据"))bel_4.setText(_translate("MainWindow", "事件:"))self.scrollAreaWidgetContents_1.show()UI实现效果如下:2. 车牌识别接下来我们需要实现两个核⼼功能,包括获取车牌ROI区域和车牌⾃动识别功能。
毕业设计pythonopencv实现车牌识别预处理
毕业设计pythonopencv 实现车牌识别预处理⾸先我们需要⼀个函数可以随时获取图⽚,⽆论在什么地⽅另外我们需要考虑图⽚⼤⼩进⾏形态学操作,以下步骤并不是必选项,根据⽅法来选取⼀些预处理步骤⽐如下⾯这张进⾏预处理后,就变成filename = askopenfilename(title="选择识别图⽚", filetypes=[("jpg 图⽚", "*.jpg"),("png 图⽚","*.png")])def img_read(filename):return cv2.imdecode(np.fromfile(filename, dtype=np.uint8), cv2.IMREAD_COLOR)pic_hight,pic_width = img.shape[:2]if pic_width > MAX_WIDTH:resize_rate = MAX_WIDTH / pic_widthimg = cv2.resize(img, (MAX_WIDTH, int(pic_hight * resize_rate)), interpolation=cv2.INTER_AREA)#缩⼩图⽚blur = 3img = cv2.GaussianBlur(img,(blur,blur),0)oldimg = imgimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转化成灰度图像Matrix = np.ones((20, 20), np.uint8)img_opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, Matrix)img_opening = cv2.addWeighted(img, 1, img_opening, -1, 0)#创建20*20的元素为1的矩阵 开操作,并和img 重合ret, img_thresh = cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)img_edge = cv2.Canny(img_thresh, 100, 200)#Otsu’s ⼆值化 找到图像边缘Matrix = np.ones((4, 19), np.uint8)img_edge1 = cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, Matrix)img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, Matrix)。
车牌识别系统毕业设计
车牌识别系统毕业设计篇一:车牌识别系统毕业论文车牌识别系统毕业论文论文题目院系名称专业(班级)车牌识别系统——车辆牌照定位系统的设计与实现计算机科学与技术系计算机科学与技术摘要车牌识别系统作为智能交通系统的一个重要组成部分,在交通监控中占有很重要的地位。
车牌识别系统可分为图像预处理、车牌定位、字符识别3个部分,其中车牌定位作为获得车辆牌照图像的重要步骤,是后续的字符识别部分能否正确识别车牌字符的关键环节。
车牌定位系统实现对车辆牌照进行定位的功能,即从包含整个车辆的图像中找到车牌区域的位置,并对该车牌区域进行定位显示,将定位信息提供给字符识别部分。
在本文中作者分析出车辆牌照具有如下特征:(1)具有固定的长宽比;(2)车牌区域内部字符数目固定;(3)字符与背景之间存在很大的颜色差别;(4)对于含有车牌信息的灰度图像,其车牌区域边缘明显,灰度跳变大,相对于车牌以外区域,具有明显的特征等。
所以,一般基于图像处理的车牌定位系统是通过分析车辆牌照的某些特征来进行定位的。
针对车牌本身固有的特征,本文首先介绍了在车牌定位过程中常用的几种数字图像处理技术:图像的二值化处理、边缘检测和图像增强等。
其次介绍了现在常用的车牌定位方法,并对这些方法进行分析,总结出各种方法的优缺点,然后在此基础上提出采用带边缘检测的灰度图像行扫描投影方法对车牌进行定位,并使用VC++6.0编码实现车牌定位系统。
最后对该系统进行了测试,测试结果表明该系统具有良好的人机交互方式,具有较高的识别正确率和较快的识别速度,对用户给定的待测图像能够迅速准确地进行车辆牌照的定位并将定位结果显示给用户,该系统具有一定的实用价值。
关键词:车牌定位,灰度图像,行扫描,投影AbstractAs an important part of the Intelligent Transportation Systems, License Plate Recognition System plays an important role in traffic monitoring area. License plate recognition system can be divided into three parts, i.e., image pre-processing, license plate location and character recognition. The vehicle license plate location is an important procedure whichis used to obtain a license image. It is also the key of the following character recognition system which can identify the correct license plate characters. License plate location system can perform the vehicle license location function, i.e., finding the location of the vehicle license in the image containing the entire vehicle license plate, positioning the plate region and then demonstrating the location information on the xxputer screen which will be transferred to the character recognition system.In this thesis, the author analyzes the vehicle license and finds that it has the following characteristics: Fixed aspect ratio. Fixed license plate characters number. Great color difference between characters and background. Obvious edge and great intensity change for grayscale images with registration information, and obvious characteristics xxpared with the outer plate region. Therefore, the majority of image-based positioning systems perform location function by analyzing some characteristics of the vehicle license.According to the own inherent characteristics oflicense plate, this thesis introduces many xxmonly used digital image processing techniques in the location process of license plate: binary image processing, edge detection and image enhancement, and so on. Then, we introduce the xxmonly used methods of license plate location. Further, we analysis these methods and summarize their advantages and disadvantages. Moreover, we propose locating plate by using the gray-scale image projection and line scanning method with edge detection. This system was implemented by using the VC++ 6.0. Finally, the experimental results indicate that the system has a good human-xxputer interaction, a better identification rate and higher speed. For images provided by users, the system can quickly and accurately locate the vehicle license and display the location results to the users. Therefore, this system has some practical values.Key words: license plate location, gray-scale images, line scan, projection目录摘要 ................................................................................................... (I)Abstract .......................................... ................................................... ............................................ III 目录 ................................................ ................................................... (IV)第一章绪论 ................................................ ................................................... (1)1.1 课题的及意义 ................................................ ................................................... . (1)1.2 课题主要研究的问题 ................................................ ................................................... (1)1.3 系统设计的目标及基本思路 ................................................ (1)1.3.1 设计目标 ................................................ ................................................... (2)1.3.2 基本思路 ................................................ ................................................... (2)第二章车牌定位中常用的数字图像处理技术 ................................................ . (3)2.1 汽车牌照的特征 ................................................ ................................................... .. (3)2.2 数字图像处理技术概述 ................................................ .. (3)2.3 DIB图像概述 ................................................ ................................................... (3)2.4 车牌定位中常用的数字图像处理技术概述 ................................................ (4)2.4.1 图像二值化 ................................................ ................................................... .. (4)2.4.2 边缘检测 ................................................ ................................................... (4)2.4.3 图像增强 ................................................ ................................................... (5)第三章车牌定位方法研究 ................................................ ................................................... (6)3.1 车牌定位常用方法介绍 ................................................ (6)3.1.1 基于纹理特征分析的定位方法 ................................................ (6)3.1.2 基于数学形态学的定位方法 ................................................ . (6)3.1.3 基于边缘检测的定位方法 ................................................ .. (6)3.1.4 基于小波分析的定位方法 ................................................ .. (6)3.1.5 基于图像彩色信息的定位方法 ................................................ (6)3.2 基于行扫描灰度跳变分析的车牌定位方法 ................................................ (7)第四章车牌定位系统的设计与实现 ................................................ .. (8)4.1 车牌定位系统系统分析 ................................................ .. (8)4.1.1系统业务需求 ................................................ ................................................... .. (8)4.1.2系统用户需求 ................................................ ................................................... .. (8)4.1.3系统功能需求 ................................................ ................................................... .. (8)4.1.4 系统运行环境需求 ................................................ .. (8)4.2 车牌定位系统的整体架构设计 ................................................ .. (8)4.2.1 系统总体架构 ................................................ ................................................... . (8)4.2.2 系统技术架构 ................................................ ................................................... . (9)4.3 车牌定位系统的功能模块划分和实现 ................................................ (10)4.3.1 系统的功能模块划分 ................................................ .. (10)4.3.2 系统的功能模块实现 ................................................ .. (11)第五章车牌定位系统的系统测试 ................................................ . (16)5.1 系统测试过程 ................................................ ................................................... (16)5.2 系统测试结果 ................................................ ................................................... . (17)5.3 测试结果分析 ................................................ ................................................... . (24)第六章技术要点回顾 ................................................ ................................................... (26)6.1 难度分析 ................................................ ................................................... (26)6.2 主要工作 ................................................ ................................................... (26)6.3 应用的主要技术手段 ................................................ ....................................................266.4 存在的问题及展望 ................................................ ................................................... .. (27)结论 ................................................ ................................................... (28)参考文献 ................................................ ................................................... (29)致谢 ................................................ ................................................... (30)篇二:在车牌自动识别系统中对字符的分割与识别的研摘要随着世界各国汽车数量的急剧增加,城市交通状况口益受到人们的重视。
毕业设计pythonopencv实现车牌识别界面
毕业设计pythonopencv实现车牌识别界⾯主要代码参考GitHub:答辩通过了,补完~这⾥主要是⽤两种⽅法进⾏定位识别# -*- coding: utf-8 -*-__author__ = '樱花落舞'import tkinter as tkfrom tkinter.filedialog import *from tkinter import ttkimport img_function as predictimport cv2from PIL import Image, ImageTkimport threadingimport timeimport img_mathimport tracebackimport debugimport configfrom threading import Threadclass ThreadWithReturnValue(Thread):def__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None):Thread.__init__(self, group, target, name, args, kwargs, daemon=daemon)self._return1 = Noneself._return2 = Noneself._return3 = Nonedef run(self):if self._target is not None:self._return1,self._return2,self._return3 = self._target(*self._args, **self._kwargs)def join(self):Thread.join(self)return self._return1,self._return2,self._return3class Surface(ttk.Frame):pic_path = ""viewhigh = 600viewwide = 600update_time = 0thread = Nonethread_run = Falsecamera = Nonecolor_transform = {"green": ("绿牌", "#55FF55"), "yello": ("黄牌", "#FFFF00"), "blue": ("蓝牌", "#6666FF")}def__init__(self, win):ttk.Frame.__init__(self, win)frame_left = ttk.Frame(self)frame_right1 = ttk.Frame(self)frame_right2 = ttk.Frame(self)win.title("车牌识别")win.state("zoomed")self.pack(fill=tk.BOTH, expand=tk.YES, padx="10", pady="10")frame_left.pack(side=LEFT, expand=1, fill=BOTH)frame_right1.pack(side=TOP, expand=1, fill=tk.Y)frame_right2.pack(side=RIGHT, expand=0)bel(frame_left, text='原图:').pack(anchor="nw")bel(frame_right1, text='形状定位车牌位置:').grid(column=0, row=0, sticky=tk.W)from_pic_ctl = ttk.Button(frame_right2, text="来⾃图⽚", width=20, command=self.from_pic)from_vedio_ctl = ttk.Button(frame_right2, text="来⾃摄像头", width=20, command=self.from_vedio)from_img_pre = ttk.Button(frame_right2, text="查看形状预处理图像", width=20,command = self.show_img_pre) self.image_ctl = bel(frame_left)self.image_ctl.pack(anchor="nw")self.roi_ctl = bel(frame_right1)self.roi_ctl.grid(column=0, row=1, sticky=tk.W)bel(frame_right1, text='形状定位识别结果:').grid(column=0, row=2, sticky=tk.W) self.r_ctl = bel(frame_right1, text="",font=('Times','20'))self.r_ctl.grid(column=0, row=3, sticky=tk.W)self.color_ctl = bel(frame_right1, text="", width="20")self.color_ctl.grid(column=0, row=4, sticky=tk.W)from_vedio_ctl.pack(anchor="se", pady="5")from_pic_ctl.pack(anchor="se", pady="5")from_img_pre.pack(anchor="se", pady="5")bel(frame_right1, text='颜⾊定位车牌位置:').grid(column=0, row=5, sticky=tk.W) self.roi_ct2 = bel(frame_right1)self.roi_ct2.grid(column=0, row=6, sticky=tk.W)bel(frame_right1, text='颜⾊定位识别结果:').grid(column=0, row=7, sticky=tk.W) self.r_ct2 = bel(frame_right1, text="",font=('Times','20'))self.r_ct2.grid(column=0, row=8, sticky=tk.W)self.color_ct2 = bel(frame_right1, text="", width="20")self.color_ct2.grid(column=0, row=9, sticky=tk.W)self.predictor = predict.CardPredictor()self.predictor.train_svm()def get_imgtk(self, img_bgr):img = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)im = Image.fromarray(img)imgtk = ImageTk.PhotoImage(image=im)wide = imgtk.width()high = imgtk.height()if wide > self.viewwide or high > self.viewhigh:wide_factor = self.viewwide / widehigh_factor = self.viewhigh / highfactor = min(wide_factor, high_factor)wide = int(wide * factor)if wide <= 0: wide = 1high = int(high * factor)if high <= 0: high = 1im = im.resize((wide, high), Image.ANTIALIAS)imgtk = ImageTk.PhotoImage(image=im)return imgtkdef show_roi1(self, r, roi, color):if r:roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)roi = Image.fromarray(roi)self.imgtk_roi = ImageTk.PhotoImage(image=roi)self.roi_ctl.configure(image=self.imgtk_roi, state='enable')self.r_ctl.configure(text=str(r))self.update_time = time.time()try:c = self.color_transform[color]self.color_ctl.configure(text=c[0], background=c[1], state='enable') except:self.color_ctl.configure(state='disabled')elif self.update_time + 8 < time.time():self.roi_ctl.configure(state='disabled')self.r_ctl.configure(text="")self.color_ctl.configure(state='disabled')def show_roi2(self, r, roi, color):if r:roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)roi = Image.fromarray(roi)self.imgtk_roi = ImageTk.PhotoImage(image=roi)self.roi_ct2.configure(image=self.imgtk_roi, state='enable')self.r_ct2.configure(text=str(r))self.update_time = time.time()try:c = self.color_transform[color]self.color_ct2.configure(text=c[0], background=c[1], state='enable')except:self.color_ct2.configure(state='disabled')elif self.update_time + 8 < time.time():self.roi_ct2.configure(state='disabled')self.r_ct2.configure(text="")self.color_ct2.configure(state='disabled')def show_img_pre(self):filename = config.get_name()if filename.any() == True:debug.img_show(filename)def from_vedio(self):if self.thread_run:returnif self.camera is None:self.camera = cv2.VideoCapture(0)if not self.camera.isOpened():mBox.showwarning('警告', '摄像头打开失败!')self.camera = Nonereturnself.thread = threading.Thread(target=self.vedio_thread, args=(self,))self.thread.setDaemon(True)self.thread.start()self.thread_run = Truedef from_pic(self):self.thread_run = Falseself.pic_path = askopenfilename(title="选择识别图⽚", filetypes=[("jpg图⽚", "*.jpg"), ("png图⽚", "*.png")]) if self.pic_path:img_bgr = img_math.img_read(self.pic_path)first_img, oldimg = self.predictor.img_first_pre(img_bgr)self.imgtk = self.get_imgtk(img_bgr)self.image_ctl.configure(image=self.imgtk)th1 = ThreadWithReturnValue(target=self.predictor.img_color_contours,args=(first_img,oldimg))th2 = ThreadWithReturnValue(target=self.predictor.img_only_color,args=(oldimg,oldimg,first_img))th1.start()th2.start()r_c, roi_c, color_c = th1.join()r_color,roi_color,color_color = th2.join()print(r_c,r_color)self.show_roi2(r_color, roi_color, color_color)self.show_roi1(r_c, roi_c, color_c)@staticmethoddef vedio_thread(self):self.thread_run = Truepredict_time = time.time()while self.thread_run:_, img_bgr = self.camera.read()self.imgtk = self.get_imgtk(img_bgr)self.image_ctl.configure(image=self.imgtk)if time.time() - predict_time > 2:r, roi, color = self.predictor(img_bgr)self.show_roi(r, roi, color)predict_time = time.time()print("run end")def close_window():print("destroy")if surface.thread_run:surface.thread_run = Falsesurface.thread.join(2.0)win.destroy()if__name__ == '__main__':win = ()surface = Surface(win)# close,退出输出destroywin.protocol('WM_DELETE_WINDOW', close_window) # 进⼊消息循环win.mainloop()。
Python-车牌识别
Python-车牌识别⼀.车牌识别系统的⽤途与技术车牌识别系统(Vehicle License Plate Recognition,VLPR) 是计算机视频图像识别技术在车辆牌照识别中的⼀种应⽤。
车牌识别在⾼速公路车辆管理中得到⼴泛应⽤,电⼦收费(ETC)系统中,也是结合DSRC技术识别车辆⾝份的主要⼿段。
车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,通过车牌提取、图像预处理、特征提取、车牌字符识别等技术,识别车辆牌号、颜⾊等信息,⽬前最新的技术⽔平为字母和数字的识别率可达到99.7%,汉字的识别率可达到99%。
在停车场管理中,车牌识别技术也是识别车辆⾝份的主要⼿段。
在深圳市公安局建设的《停车库(场)车辆图像和号牌信息采集与传输系统技术要求》中,车牌识别技术成为车辆⾝份识别的主要⼿段。
车牌识别技术结合电⼦不停车收费系统(ETC)识别车辆,过往车辆通过道⼝时⽆须停车,即能够实现车辆⾝份⾃动识别、⾃动收费。
在车场管理中,为提⾼出⼊⼝车辆通⾏效率,车牌识别针对⽆需收停车费的车辆(如⽉卡车、内部免费通⾏车辆),建设⽆⼈值守的快速通道,免取卡、不停车的出⼊体验,正改变出⼊停车场的管理模式。
⼆.运⽤Python代码完成车牌识别1.将给定车牌圈出,并保存在⽂件夹中。
2.将车牌中的数字和⽂字圈出、并保存在⽂件夹中。
思路分析:对图⽚进⾏⼀些预处理,包括灰度化、⾼斯平滑、中值滤波、Sobel算⼦边缘检测等等。
对预处理后的图像进⾏轮廓查找,然后根据⼀些RGB参数判断该轮廓是否为车牌轮廓。
import cv2import numpy as npimage = cv2.imread('C:\\Users\\sunyu\\Desktop\\sy.jpg')cv2.imshow("image", image)hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)lower = np.array([110, 100, 150])upper = np.array([125, 200, 255])mask = cv2.inRange(hsv_img, lowerb=lower, upperb=upper)kernel = np.ones((5,5), np.uint8)mask = cv2.dilate(mask, kernel, iterations=10)cv2.imshow("mask", mask)contours, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#cv2.waitKey(0)for c in contours:# find bounding box coordinates# 现计算出⼀个简单的边界框x, y, w, h = cv2.boundingRect(c) # 将轮廓信息转换成(x, y)坐标,并加上矩形的⾼度和宽度if w < 2*h:continue#cv2.imwrite('con'+str(index)+'.jpg', result[y:y+h, x:x+w])cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) # 画出矩形new = image[y:y+h, x:x+w]gray = cv2.cvtColor(new.copy(), cv2.COLOR_BGR2GRAY) # 灰度图ret, thresh = cv2.threshold(gray, 160, 255, cv2.THRESH_BINARY) # 阈值分割contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)index = 0for c in contours:# find bounding box coordinates# 现计算出⼀个简单的边界框x, y, w, h = cv2.boundingRect(c) # 将轮廓信息转换成(x, y)坐标,并加上矩形的⾼度和宽度if w > 40:continueindex = index+1cv2.rectangle(new, (x, y), (x+w, y+h), (0, 255, 0), 2) # 画出矩形cv2.imwrite('C:\\Users\\sunyu\\Desktop\\pi\\s' + str(index)+'.jpg',new)cv2.imshow('new', new)cv2.imwrite('C:\\Users\\sunyu\\Desktop\\pi\\s.jpg',new)cv2.waitKey(0)本代码中的图⽚路径根据读者情况随机应变。
车牌识别Python程序
# -*- coding: utf-8 -*-__author__ = 'd1bysj'import pymysqldb = pymysql.connect(host = '', # 远程主机的ip地址,user = '', # MySQL用户名db = '', # database名passwd = '', # 数据库密码port = 3306, #数据库监听端口,默认3306charset = "utf8") #指定utf8编码的连接cur= db.cursor()sql="select * from sex"try:cur.execute(sql)re=cur.fetchall()for it in re:name = it[0]num = it[1]print(name,num)except Exception as e:raise efinally:db.close()import cv2import numpy as npfrom numpy.linalg import normimport sysimport osimport jsonSZ = 20 # 训练图片长宽MAX_WIDTH = 1000 # 原始图片最大宽度Min_Area = 2000 # 车牌区域允许最大面积PROVINCE_START = 1000# 读取图片文件def imreadex(filename):return cv2.imdecode(np.fromfile(filename, dtype=np.uint8), cv2.IMREAD_COLOR) def point_limit(point):if point[0] < 0:point[0] = 0if point[1] < 0:point[1] = 0# 根据设定的阈值和图片直方图,找出波峰,用于分隔字符def find_waves(threshold, histogram):up_point = -1 # 上升点is_peak = Falseif histogram[0] > threshold:up_point = 0is_peak = Truewave_peaks = []for i, x in enumerate(histogram):if is_peak and x < threshold:if i - up_point > 2:is_peak = Falsewave_peaks.append((up_point, i))elif not is_peak and x >= threshold:is_peak = Trueup_point = iif is_peak and up_point != -1 and i - up_point > 4:wave_peaks.append((up_point, i))return wave_peaks# 根据找出的波峰,分隔图片,从而得到逐个字符图片def seperate_card(img, waves):part_cards = []for wave in waves:part_cards.append(img[:, wave[0]:wave[1]])return part_cards# 来自opencv的sample,用于svm训练def deskew(img):m = cv2.moments(img)if abs(m['mu02']) < 1e-2:return img.copy()skew = m['mu11'] / m['mu02']M = np.float32([[1, skew, -0.5 * SZ * skew], [0, 1, 0]])img = cv2.warpAffine(img, M, (SZ, SZ), flags=cv2.WARP_INVERSE_MAP | cv2.INTER_LINEAR)return img# 来自opencv的sample,用于svm训练def preprocess_hog(digits):samples = []for img in digits:gx = cv2.Sobel(img, cv2.CV_32F, 1, 0)gy = cv2.Sobel(img, cv2.CV_32F, 0, 1)mag, ang = cv2.cartToPolar(gx, gy)bin_n = 16bin = np.int32(bin_n * ang / (2 * np.pi))bin_cells = bin[:10, :10], bin[10:, :10], bin[:10, 10:], bin[10:, 10:] mag_cells = mag[:10, :10], mag[10:, :10], mag[:10, 10:], mag[10:, 10:] hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells, mag_cells)]hist = np.hstack(hists)# transform to Hellinger kerneleps = 1e-7hist /= hist.sum() + epshist = np.sqrt(hist)hist /= norm(hist) + epssamples.append(hist)return np.float32(samples)# 不能保证包括所有省份provinces = ["zh_cuan", "川","zh_e", "鄂","zh_gan", "赣","zh_gan1", "甘","zh_gui", "贵","zh_gui1", "桂","zh_hei", "黑","zh_hu", "沪","zh_ji", "冀","zh_jin", "津","zh_jing", "京","zh_jl", "吉","zh_liao", "辽","zh_lu", "鲁","zh_meng", "蒙","zh_min", "闽","zh_ning", "宁","zh_qing", "靑","zh_qiong", "琼","zh_shan", "陕","zh_su", "苏","zh_sx", "晋","zh_wan", "皖","zh_xiang", "湘","zh_xin", "新","zh_yu", "豫","zh_yu1", "渝","zh_yue", "粤","zh_yun", "云","zh_zang", "藏","zh_zhe", "浙"]class StatModel(object):def load(self, fn):self.model = self.model.load(fn)def save(self, fn):self.model.save(fn)class SVM(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)# 训练svmdef train(self, samples, responses):self.model.train(samples, cv2.ml.ROW_SAMPLE, responses)# 字符识别def predict(self, samples):r = self.model.predict(samples)return r[1].ravel()class CardPredictor:def __init__(self):# 车牌识别的部分参数保存在js中,便于根据图片分辨率做调整f = open('config.js')j = json.load(f)for c in j["config"]:print(c)if c["open"]:self.cfg = c.copy()breakelse:raise RuntimeError('没有设置有效配置参数')def __del__(self):self.save_traindata()def train_svm(self):# 识别英文字母和数字self.model = SVM(C=1, gamma=0.5)# 识别中文self.modelchinese = SVM(C=1, gamma=0.5)if os.path.exists("svm.dat"):self.model.load("svm.dat")else:chars_train = []chars_label = []for root, dirs, files in os.walk("train\\chars2"):if len(os.path.basename(root)) > 1:continueroot_int = ord(os.path.basename(root))for filename in files: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)if os.path.exists("svmchinese.dat"):self.modelchinese.load("svmchinese.dat")else:chars_train = []chars_label = []for root, dirs, files in os.walk("train\\charsChinese"):if not os.path.basename(root).startswith("zh_"):continuepinyin = os.path.basename(root)index = provinces.index(pinyin) + PROVINCE_START + 1 # 1是拼音对应的汉字for filename in files: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(index)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.modelchinese.train(chars_train, chars_label)def save_traindata(self):if not os.path.exists("svm.dat"):self.model.save("svm.dat")if not os.path.exists("svmchinese.dat"):self.modelchinese.save("svmchinese.dat")def accurate_place(self, card_img_hsv, limit1, limit2, color):row_num, col_num = card_img_hsv.shape[:2]xl = col_numxr = 0yh = 0yl = row_num# col_num_limit = self.cfg["col_num_limit"]row_num_limit = self.cfg["row_num_limit"]col_num_limit = col_num * 0.8 if color != "green" else col_num * 0.5 # 绿色有渐变for i in range(row_num):count = 0for j in range(col_num):H = card_img_hsv.item(i, j, 0)S = card_img_hsv.item(i, j, 1)V = card_img_hsv.item(i, j, 2)if limit1 < H <= limit2 and 34 < S and 46 < V:count += 1if count > col_num_limit:if yl > i:yl = iif yh < i:yh = ifor j in range(col_num):count = 0for i in range(row_num):H = card_img_hsv.item(i, j, 0)S = card_img_hsv.item(i, j, 1)V = card_img_hsv.item(i, j, 2)if limit1 < H <= limit2 and 34 < S and 46 < V:count += 1if count > row_num - row_num_limit:if xl > j:xl = jif xr < j:xr = jreturn xl, xr, yh, yldef predict(self, car_pic):if type(car_pic) == type(""):img = imreadex(car_pic)else:img = car_picpic_hight, pic_width = img.shape[:2]if pic_width > MAX_WIDTH:resize_rate = MAX_WIDTH / pic_widthimg = cv2.resize(img, (MAX_WIDTH, int(pic_hight * resize_rate)), interpolation=cv2.INTER_AREA)blur = self.cfg["blur"]# 高斯去噪if blur > 0:img = cv2.GaussianBlur(img, (blur, blur), 0) # 图片分辨率调整oldimg = imgimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# equ = cv2.equalizeHist(img)# img = np.hstack((img, equ))# 去掉图像中不会是车牌的区域kernel = np.ones((20, 20), np.uint8)img_opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)img_opening = cv2.addWeighted(img, 1, img_opening, -1, 0);# 找到图像边缘ret, img_thresh = cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)img_edge = cv2.Canny(img_thresh, 100, 200)# 使用开运算和闭运算让图像边缘成为一个整体kernel = np.ones((self.cfg["morphologyr"], self.cfg["morphologyc"]), np.uint8)img_edge1 = cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel)img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, kernel)# 查找图像边缘整体形成的矩形区域,可能有很多,车牌就在其中一个矩形区域中 image, contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = [cnt for cnt in contours if cv2.contourArea(cnt) > Min_Area] print('len(contours)', len(contours))# 一一排除不是车牌的矩形区域car_contours = []for cnt in contours:rect = cv2.minAreaRect(cnt)area_width, area_height = rect[1]if area_width < area_height:area_width, area_height = area_height, area_widthwh_ratio = area_width / area_height# print(wh_ratio)# 要求矩形区域长宽比在2到5.5之间,2到5.5是车牌的长宽比,其余的矩形排除if wh_ratio > 2 and wh_ratio < 5.5:car_contours.append(rect)box = cv2.boxPoints(rect)box = np.int0(box)# oldimg = cv2.drawContours(oldimg, [box], 0, (0, 0, 255), 2)# cv2.imshow("edge4", oldimg)# print(rect)print(len(car_contours))print("精确定位")card_imgs = []# 矩形区域可能是倾斜的矩形,需要矫正,以便使用颜色定位for rect in car_contours:if rect[2] > -1 and rect[2] < 1: # 创造角度,使得左、高、右、低拿到正确的值angle = 1else:angle = rect[2]rect = (rect[0], (rect[1][0] + 5, rect[1][1] + 5), angle) # 扩大范围,避免车牌边缘被排除box = cv2.boxPoints(rect)heigth_point = right_point = [0, 0]left_point = low_point = [pic_width, pic_hight]for point in box:if left_point[0] > point[0]:left_point = pointif low_point[1] > point[1]:low_point = pointif heigth_point[1] < point[1]:heigth_point = pointif right_point[0] < point[0]:right_point = pointif left_point[1] <= right_point[1]: # 正角度new_right_point = [right_point[0], heigth_point[1]]pts2 = np.float32([left_point, heigth_point, new_right_point]) # 字符只是高度需要改变pts1 = np.float32([left_point, heigth_point, right_point])M = cv2.getAffineTransform(pts1, pts2)dst = cv2.warpAffine(oldimg, M, (pic_width, pic_hight))point_limit(new_right_point)point_limit(heigth_point)point_limit(left_point)card_img = dst[int(left_point[1]):int(heigth_point[1]), int(left_point[0]):int(new_right_point[0])]card_imgs.append(card_img)# cv2.imshow("card", card_img)# cv2.waitKey(0)elif left_point[1] > right_point[1]: # 负角度new_left_point = [left_point[0], heigth_point[1]]pts2 = np.float32([new_left_point, heigth_point, right_point]) # 字符只是高度需要改变pts1 = np.float32([left_point, heigth_point, right_point])M = cv2.getAffineTransform(pts1, pts2)dst = cv2.warpAffine(oldimg, M, (pic_width, pic_hight))point_limit(right_point)point_limit(heigth_point)point_limit(new_left_point)card_img = dst[int(right_point[1]):int(heigth_point[1]), int(new_left_point[0]):int(right_point[0])]card_imgs.append(card_img)# cv2.imshow("card", card_img)# cv2.waitKey(0)# 开始使用颜色定位,排除不是车牌的矩形,目前只识别蓝、绿、黄车牌colors = []for card_index, card_img in enumerate(card_imgs):green = yello = blue = black = white = 0card_img_hsv = cv2.cvtColor(card_img, cv2.COLOR_BGR2HSV)# 有转换失败的可能,原因来自于上面矫正矩形出错if card_img_hsv is None:continuerow_num, col_num = card_img_hsv.shape[:2]card_img_count = row_num * col_numfor i in range(row_num):for j in range(col_num):H = card_img_hsv.item(i, j, 0)S = card_img_hsv.item(i, j, 1)V = card_img_hsv.item(i, j, 2)if 11 < H <= 34 and S > 34: # 图片分辨率调整yello += 1elif 35 < H <= 99 and S > 34: # 图片分辨率调整green += 1elif 99 < H <= 124 and S > 34: # 图片分辨率调整blue += 1if 0 < H < 180 and 0 < S < 255 and 0 < V < 46:black += 1elif 0 < H < 180 and 0 < S < 43 and 221 < V < 225:white += 1color = "no"limit1 = limit2 = 0if yello * 2 >= card_img_count:color = "yello"limit1 = 11limit2 = 34 # 有的图片有色偏偏绿elif green * 2 >= card_img_count:color = "green"limit1 = 35limit2 = 99elif blue * 2 >= card_img_count:color = "blue"limit1 = 100limit2 = 124 # 有的图片有色偏偏紫elif black + white >= card_img_count * 0.7: # TODOcolor = "bw"print(color)colors.append(color)print(blue, green, yello, black, white, card_img_count)# cv2.imshow("color", card_img)# cv2.waitKey(0)if limit1 == 0:continue# 以上为确定车牌颜色# 以下为根据车牌颜色再定位,缩小边缘非车牌边界xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color)if yl == yh and xl == xr:continueneed_accurate = Falseif yl >= yh:yl = 0yh = row_numneed_accurate = Trueif xl >= xr:xl = 0xr = col_numneed_accurate = Truecard_imgs[card_index] = card_img[yl:yh, xl:xr] if color != "green" or yl < (yh - yl) // 4 else card_img[yl - (yh - yl) // 4:yh,xl:xr]if need_accurate: # 可能x或y方向未缩小,需要再试一次card_img = card_imgs[card_index]card_img_hsv = cv2.cvtColor(card_img, cv2.COLOR_BGR2HSV)xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color)if yl == yh and xl == xr:continueif yl >= yh:yl = 0yh = row_numif xl >= xr:xl = 0xr = col_numcard_imgs[card_index] = card_img[yl:yh, xl:xr] if color != "green" or yl < (yh - yl) // 4 else card_img[yl - (yh - yl) // 4:yh,xl:xr]# 以上为车牌定位# 以下为识别车牌中的字符predict_result = []roi = Nonecard_color = Nonefor i, color in enumerate(colors):if color in ("blue", "yello", "green"):card_img = card_imgs[i]gray_img = cv2.cvtColor(card_img, cv2.COLOR_BGR2GRAY)# 黄、绿车牌字符比背景暗、与蓝车牌刚好相反,所以黄、绿车牌需要反向if color == "green" or color == "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)if len(wave_peaks) == 0:print("peak less 0:")continue# 认为水平方向,最大的波峰为车牌区域wave = max(wave_peaks, key=lambda x: 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)# 车牌字符数应大于6if len(wave_peaks) <= 6:print("peak less 1:", len(wave_peaks))continuewave = max(wave_peaks, key=lambda x: x[1] - x[0])max_wave_dis = wave[1] - wave[0]# 判断是否是左侧车牌边缘if wave_peaks[0][1] - wave_peaks[0][0] < max_wave_dis / 3 and wave_peaks[0][0] == 0:wave_peaks.pop(0)# 组合分离汉字cur_dis = 0for i, wave in enumerate(wave_peaks):if wave[1] - wave[0] + cur_dis > max_wave_dis * 0.6:breakelse:cur_dis += wave[1] - wave[0]if i > 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]if point[1] - point[0] < max_wave_dis / 3:point_img = gray_img[:, point[0]:point[1]]if np.mean(point_img) < 255 / 5:wave_peaks.pop(2)if len(wave_peaks) <= 6:print("peak less 2:", len(wave_peaks))continuepart_cards = seperate_card(gray_img, wave_peaks)for i, part_card in enumerate(part_cards):# 可能是固定车牌的铆钉if np.mean(part_card) < 255 / 5:print("a point")continuepart_card_old = part_cardw = 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])if i == 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])# 判断最后一个数是否是车牌边缘,假设车牌边缘被认为是1if charactor == "1" and i == len(part_cards) - 1:if part_card_old.shape[0] / part_card_old.shape[1] >= 7: # 1太细,认为是边缘continuepredict_result.append(charactor)roi = card_imgcard_color = colorbreakreturn predict_result, roi, card_color # 识别到的字符、定位的车牌图像、车牌颜色if __name__ == '__main__':c = CardPredictor()c.train_svm()r, roi, color = c.predict("test/66.jpg")car = ''.join(r)print(car)# -*- coding: utf-8 -*import serialimport timeimport predictimport cv2import RPi.GPIO as GPIOimport picamerafrom time import sleepfrom threading import Threadclass deal:def __init__(self):# 设置不显示警告global serglobal cGPIO.setwarnings(False)# 设置读取面板针脚模式# 将引脚设置为输入模式GPIO.setmode(GPIO.BCM)# 设置读取针脚标号GPIO.setup(4, GPIO.IN)# GPIO.setup(2, GPIO.OUT)# 串口初始化ser = serial.Serial("/dev/ttyAMA0", 9600 ,timeout=0) time.sleep(1)c = predict.CardPredictor()c.train_svm()print('init ok!')def serial_send(self,strcar):#串口发送程序print('in serial')if ser.isOpen == False:ser.open()print('open')ser.write(strcar.encode(encoding="GB2312")) try:while True:size = ser.inWaiting()if size != 0:response = ser.read(size)print (response)print('send ok!')ser.flushInput()time.sleep(0.1)except KeyboardInterrupt:if ser != None:print('none')ser.close()else:print('opened')print(strcar.encode(encoding="GB2312"))ser.write(strcar.encode(encoding="GB2312"))print('send ok!')print('income')size = ser.inWaiting()if size != 0:print('size')response = ser.read(size)print(response)print('send ok!')ser.flushInput()time.sleep(0.1)ser.close()def camera_vedio(self):#global img_bgr#if self.camera is None:#self.camera = cv2.VideoCapture(0)#if not self.camera.isOpened():# print('警告,摄像头打开失败!')# self.camera = None# return#predict_time = time.time()# _, img_bgr = self.camera.read()#print('Already photographed')camera = picamera.PiCamera()camera.capture('img_bgr.jpg')camera.start_preview()camera.vflip = Truecamera.hflip = Truecamera.brightness = 30sleep(0.01)camera.close()if __name__ == '__main__':b = deal()while True:b.__init__()try:if GPIO.input(4) == GPIO. LOW:print('Exorbitant vehicles')time.sleep(0.01) # wait 10 ms to give CPU chance to do other thingsb.camera_vedio()time.sleep(0.01) # wait 10 ms to give CPU chance to do other thingsimg_bgr = "img_bgr.jpg"r, roi, color = c.predict(img_bgr)car_str = ''.join(r)if car_str.strip() != "":b.serial_send('#')print('recongnize ok!')print(car_str)b.serial_send(car_str)b.serial_send('%')print('Runing')except KeyboardInterrupt:if ser != None:ser.close()import tkinter as tkfrom tkinter.filedialog import *from tkinter import ttkimport predictimport cv2from PIL import Image, ImageTkimport threadingimport timeclass Surface(ttk.Frame):pic_path = ""viewhigh = 600viewwide = 600update_time = 0thread = Nonethread_run = Falsecamera = Nonecolor_transform = {"green":("绿牌","#55FF55"), "yello":("黄牌","#FFFF00"), "blue":("蓝牌","#6666FF")}def __init__(self, win):ttk.Frame.__init__(self, win)frame_left = ttk.Frame(self)frame_right1 = ttk.Frame(self)frame_right2 = ttk.Frame(self)win.title("车牌识别")win.state("zoomed")self.pack(fill=tk.BOTH, expand=tk.YES, padx="5", pady="5")frame_left.pack(side=LEFT,expand=1,fill=BOTH)frame_right1.pack(side=TOP,expand=1,fill=tk.Y)frame_right2.pack(side=RIGHT,expand=0)bel(frame_left, text='原图:').pack(anchor="nw")bel(frame_right1, text='车牌位置:').grid(column=0, row=0, sticky=tk.W)from_pic_ctl = ttk.Button(frame_right2, text="来自图片", width=20, command=self.from_pic)from_vedio_ctl = ttk.Button(frame_right2, text="来自摄像头", width=20, command=self.from_vedio)self.image_ctl = bel(frame_left)self.image_ctl.pack(anchor="nw")self.roi_ctl = bel(frame_right1)self.roi_ctl.grid(column=0, row=1, sticky=tk.W)bel(frame_right1, text='识别结果:').grid(column=0, row=2, sticky=tk.W)self.r_ctl = bel(frame_right1, text="")self.r_ctl.grid(column=0, row=3, sticky=tk.W)self.color_ctl = bel(frame_right1, text="", width="20")self.color_ctl.grid(column=0, row=4, sticky=tk.W)from_vedio_ctl.pack(anchor="se", pady="5")from_pic_ctl.pack(anchor="se", pady="5")self.predictor = predict.CardPredictor()self.predictor.train_svm()def get_imgtk(self, img_bgr):img = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)im = Image.fromarray(img)imgtk = ImageTk.PhotoImage(image=im)wide = imgtk.width()high = imgtk.height()if wide > self.viewwide or high > self.viewhigh:wide_factor = self.viewwide / widehigh_factor = self.viewhigh / highfactor = min(wide_factor, high_factor)wide = int(wide * factor)if wide <= 0 : wide = 1high = int(high * factor)if high <= 0 : high = 1im=im.resize((wide, high), Image.ANTIALIAS)imgtk = ImageTk.PhotoImage(image=im)return imgtkdef show_roi(self, r, roi, color):if r :roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)roi = Image.fromarray(roi)self.imgtk_roi = ImageTk.PhotoImage(image=roi)self.roi_ctl.configure(image=self.imgtk_roi, state='enable')self.r_ctl.configure(text=str(r))self.update_time = time.time()try:c = self.color_transform[color]self.color_ctl.configure(text=c[0], background=c[1], state='enable')except:self.color_ctl.configure(state='disabled')elif self.update_time + 8 < time.time():self.roi_ctl.configure(state='disabled')self.r_ctl.configure(text="")self.color_ctl.configure(state='disabled')def from_vedio(self):if self.thread_run:returnif self.camera is None:self.camera = cv2.VideoCapture(0)if not self.camera.isOpened():mBox.showwarning('警告', '摄像头打开失败!')self.camera = Nonereturnself.thread = threading.Thread(target=self.vedio_thread, args=(self,))self.thread.setDaemon(True)self.thread.start()self.thread_run = Truedef from_pic(self):self.thread_run = Falseself.pic_path = askopenfilename(title="选择识别图片", filetypes=[("jpg 图片", "*.jpg")])if self.pic_path:img_bgr = predict.imreadex(self.pic_path)self.imgtk = self.get_imgtk(img_bgr)self.image_ctl.configure(image=self.imgtk)r, roi, color = self.predictor.predict(img_bgr)self.show_roi(r, roi, color)string = ''.join(r);print(string)@staticmethoddef vedio_thread(self):self.thread_run = Truepredict_time = time.time()while self.thread_run:_, img_bgr = self.camera.read()self.imgtk = self.get_imgtk(img_bgr)self.image_ctl.configure(image=self.imgtk)if time.time() - predict_time > 2:r, roi, color = self.predictor.predict(img_bgr)self.show_roi(r, roi, color)string = ''.join(r);print(string)predict_time = time.time()print("run end")def close_window():print("destroy")if surface.thread_run :surface.thread_run = Falsesurface.thread.join(2.0)win.destroy()if __name__ == '__main__':win=()surface = Surface(win)#close,退出输出destroywin.protocol('WM_DELETE_WINDOW', close_window)#进入消息循环win.mainloop()# -*- coding:utf-8 -*-import serialimport time#### 定义小灯亮灭初始值i = 0#### 实例化串口ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=0.5)print('send satrt')for j in range(10):if ser.isOpen() == False:ser.open()#### 每次循环对上值次取反if i == 0:i = 1else:i = 0ser.write(chr(i)) #### 向串口发送字符print('send ok')#### 获取串口返回值#### linux为福阻塞模式,在阻塞模式下#### 会报错,所以抱起来就好了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
python实现汽车车牌识别毕业设计毕业设计题目:基于Python的汽车车牌识别系统研究与实现
引言:
随着汽车数量的不断增加,车牌识别技术在交通管理、安全监控
和智能化交通领域的重要性日益凸显。
本文旨在利用Python语言,实
现一个高效、精准的汽车车牌识别系统,为交通管理和智能交通发展
提供有力支持。
一、研究目的与意义
1.1 研究目的
本研究旨在开发一套基于Python的汽车车牌识别系统,通过图像
处理和模式识别技术,实现对汽车车牌的自动化识别,为交通管理提
供快速、准确的信息。
同时,通过对系统的改进和优化,提高车牌识
别的准确性和可靠性。
1.2 研究意义
车牌识别技术在交通管理和智能交通领域具有广泛的应用前景。
首先,它可以用于交通违法行为的检测,如闯红灯、超速等,提高交
通管理的效率和精确度。
其次,车牌识别技术可以应用于智能停车场
管理系统,提供自动化的进出场控制,并为车主提供方便的停车服务。
此外,车牌识别技术还可以应用于车辆盗抢防治、交通流量检测等领域,发挥重要作用。
二、识别系统设计与实现
2.1 系统框架设计
本系统采用了经典的车牌识别流程,包括图像预处理、车牌定位、字符分割与提取、字符识别等关键环节。
通过这些步骤,系统能够实
现对车牌区域的准确提取与识别。
2.2 图像预处理
在图像预处理阶段,我们采用了图像滤波、边缘检测、图像增强
等技术,对原始图像进行处理,以提高后续车牌定位与字符识别的准
确性。
2.3 车牌定位
车牌定位是整个识别系统的关键步骤。
我们采用了基于颜色特征
和形状特征相结合的方法,通过对图像进行特征提取和分析,确定车
牌区域。
2.4 字符分割与提取
在车牌定位后,我们将车牌图像进行字符分割与提取。
这一步骤
涉及到字符分割算法和特征提取方法,通过对字符进行分割和特征提取,提高后续字符识别的准确性。
2.5 字符识别
字符识别是整个识别系统的最后一步。
我们采用了基于模板匹配
和机器学习的方法,对提取的字符进行识别,通过训练模型和匹配算法,实现字符的自动识别,并输出识别结果。
三、实验与结果分析
我们在自采集的大量车牌图像数据上进行了实验,并进行了系统
的准确性和鲁棒性测试。
实验结果表明,我们的系统在车牌识别准确
率和鲁棒性方面均取得了优秀的表现,与业界领先的车牌识别系统相
媲美。
四、总结与展望
通过本次毕业设计,我们成功实现了一个具有高准确性和鲁棒性
的基于Python的汽车车牌识别系统。
该系统在交通管理和智能交通领
域具有重要意义,为交通管理提供了有效手段和技术支持。
然而,仍
然存在一些待解决的问题和改进的空间。
下一步,我们将进一步优化
系统的性能,加强对复杂场景的适应性,提高车牌识别的准确性和稳
定性,为智能交通的发展做出更大的贡献。
总之,基于Python的汽车车牌识别系统的设计与实现是一项具有
指导意义的毕业设计,它不仅为交通管理提供了强有力的支持,也为
智能交通的发展奠定了基础。
随着技术的不断进步和系统的不断优化,相信汽车车牌识别技术将在未来实现更加广泛的应用和推广。