【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目-程序员宅基地

技术标签: python  OpenCV项目实战  车牌识别  深度学习实战  AI应用软件开发实战  停车场管理系统  opencv  

车牌识别基础功能演示

在这里插入图片描述

摘要:车牌识别系统(Vehicle License Plate Recognition,VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息(含汉字字符、英文字母、阿拉伯数字及号牌颜色)进行处理的技术。车牌识别是现代智能交通系统中的重要组成部分之一,应用十分广泛。本文详细介绍了车牌识别技术的基本实现原理,并且基于pythonpyqt开发了一套功能完整的车牌识别的停车场管理系统软件,实现了通过图片或者摄像头的方式进行进出停车场车辆车牌自动识别车牌登记信息录入已登记车辆有效期时间管理车辆进出记录管理以及外来车辆收费系统等功能。本文提供了完整的Python代码和使用教程,给感兴趣的小伙伴参考学习,完整的代码资源文件获取方式见文末

点击跳转至文末《完整源码及相关文件》获取

---

1. 前言

车牌识别系统(Vehicle License Plate Recognition,VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息(含汉字字符、英文字母、阿拉伯数字及号牌颜色)进行处理的技术。车牌识别是现代智能交通系统中的重要组成部分之一,应用十分广泛。它以数字图像处理、模式识别、计算机视觉等技术为基础,对摄像机所拍摄的车辆图像或者视频序列进行分析,得到每一辆汽车唯一的车牌号码,从而完成识别过程。

车牌识别技术主要应用领域有停车场收费管理,交通流量控制指标测量,车辆定位,汽车防盗,高速公路超速自动化监管、闯红灯电子警察、公路收费站等等功能。对于维护交通安全和城市治安,防止交通堵塞,实现交通自动化管理有着现实的意义。

博主根据车牌识别技术开发了本文中介绍的一套功能完整的停车场收费与车辆管理系统,功能主要包括:进出停车场车辆车牌自动识别车牌登记信息录入已登记车辆有效期时间管理车辆进出记录管理以及外来车辆收费系统等功能。

基于该车牌识别技术,博主经过长时间开发,总共写了近3000行代码,并且整个系统经过了详细的调试修改。最终开发了本文介绍的车牌识别停车场管理系统软件pythonPYQT5]】,功能主要包括:进出停车场车辆车牌自动识别车牌登记信息录入已登记车辆有效期时间管理车辆进出记录管理以及外来车辆收费系统等。

觉得不错的小伙伴,感谢点赞、关注加收藏哦!更多干货内容持续更新…

登录后的软件初始界面如下图所示:
在这里插入图片描述

2. 软件核心功能介绍及效果演示

软件主要功能包括以下几个部分:

1. 登录注册模块:提供系统的登录注册功能;
2. 车辆信息登记录入模块:用于进行特殊车辆、月租车辆或业主车辆的信息管理登记指定日期内车辆进出不收费,过期后正常收费;
3. 车牌进出识别模块:用于识别停车场出入车辆的车牌信息,同时记录出入时间,并显示出入信息、收费信息、停车场车位数量信息;
4. 已登记录入车辆信息管理模块:对已录入的车辆信息进行搜索、修改、删除等管理;
5. 车辆进出信息管理模块:记录车辆进出信息、并对进出车辆进出信息搜索、删除等管理
6. 自动收费模块:能够依据记录的出入时间自动计算出入车辆的需要缴纳的费用。

下面将详细介绍各个模块的基本功能:

2.1 登录注册功能模块

本软件提供了基础的登录注册功能,对于新用户需要先注册账号才可以进行登录。界面如下:
在这里插入图片描述

2.2 车辆信息登记录入功能模块

车辆信息登记录入功能的主要作用是对特殊车辆、月租车辆或业主车辆进行信息管理,车辆在登记日期区间内,可以免费进出停车场,但是过期后需正常缴费。可在信息管理界面修改日期信息。

车辆登记需要进行照片采集,可通过上传照片或者摄像头拍照的这两种方式进行采集,车牌会自动识别填入文本框内。然后选择车辆登记有效日期,选填人员信息等内容。点击保存按钮,即可将信息保存至数据库中。采集的车辆图片会默认存入data/imgs目录中,命名方式为车牌号.jpg
车牌信息登记的初始界面如下:
在这里插入图片描述
上传图片方式采集车辆图片方式如下:
在这里插入图片描述

摄像头采集车辆图片方式如下:
先开启摄像头,车辆处于合适位置后,点击拍照按钮采集,点击关闭摄像头按钮即可。
在这里插入图片描述
采集后的车辆图片存储位置data/imgs目录下:
在这里插入图片描述

2.3 车牌识别车辆出入及收费系统模块

可通过图片或者摄像头的方式,对出入的车辆进行车牌识别。并显示车辆信息收费信息停车场车位数目等。并且可以通过单选按钮来模拟车辆的进出,从而显示不同的出入信息。
费用计算方式:费用计算:不足半小时免费,超过每小时5元,不足1小时按1小时算,每24小时20元封顶。

图片方式来模拟车辆的进入与外出:
在这里插入图片描述
车辆进入显示的信息如下:
在这里插入图片描述

车辆外出显示信息如下:
注:登记车辆会显示登记剩余天数,外来车辆没有剩余天数显示。
在这里插入图片描述
在这里插入图片描述
摄像头方式来模拟车辆的进入与外出:
在这里插入图片描述

2.4 车辆信息数据管理模块

该界面主要是显示已登记的车辆信息,支持搜索日期、业主信息等修改,以及信息删除功能。
功能展示如下:
搜索功能
在这里插入图片描述
修改、删除功能:
修改方法:双击表中的内容后,点击修改按钮,然后点击保存操作按钮,更新数据库。
删除方法:选中要删除的行,然后点击删除按钮,然后点击保存操作按钮,更新数据库。
在这里插入图片描述
显示全部按钮用于显示全部已录入的车辆信息。

2.5 车辆出入记录模块

该界面用于记录车辆的出入信息:包括车牌、出入时间、车辆类型。
支持搜索删除信息功能。
**删除方法:**选中要删除的行,然后点击删除按钮,然后点击保存操作按钮,更新数据库。
功能展示如下:
在这里插入图片描述

3. 车牌识别基本原理介绍

3.1 基本原理

车牌识别系统(Vehicle License Plate Recognition,VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息(含汉字字符、英文字母、阿拉伯数字及号牌颜色)进行处理的技术。车牌识别技术应用十分广泛,它是以数字图像处理、模式识别、计算机视觉等技术为基础,对含有车辆号牌的图像进行分析处理,从而确定牌照在图像中的位置,并进一步提取和识别出文本字符,得到每一辆汽车唯一的车牌号码,从而完成识别过程。

车牌识别的常规处理过程流程包括:图像采集、图像预处理、车牌定位、字符分割、字符识别及结果输出等处理过程。如下图所示:
在这里插入图片描述
上述各个流程相辅相成,每个处理过程均须保证其高效和较高的抗干扰能力,只有这样才能保证识别功能达到满意的效果,其中车牌定位、字符分割及字符识别这三个步骤尤为重要。

车牌定位
车牌定位的主要工作是从静态图片或视频帧中找到车牌位置,并把车牌从图像中单独分离出来以供后续处理模块处理,车牌定位如下图所示:
在这里插入图片描述
车牌定位的本质就是车牌目标检测,目前车牌位置检测方法主要有以下两种:
【方法1】基于图形图像学的定位方法
该方法主要有以下几种方式:(1)基于颜色的定位方法,如彩色边缘算法、颜色距离和相似度算法等;(2)基于纹理的定位方法,如小波纹理、水平梯度差分纹理等;(3)基于边缘检测的定位方法;(4)基于数学形态的定位方法。

基于图形图像学的定位方法,容易受到外界干扰信息的干扰而造成定位失败。如基于颜色分析的定位方法中,如果车牌背景颜色与车牌颜色相近,则很难从背景中提取车牌;在基于边缘检测的方法中,车牌边缘的污损也很容易造成定位失败。外界干扰信息的干扰也会欺骗定位算法,使得定位算法生成过多的非车牌候选区域,增大了系统负荷。

【方法2】基于机器学习的定位方法
基于机器学习的方法有基于特征工程的定位方法和基于神经网络的定位方法等。例如通过opencv提供的基于haar特征的级联分类器,训练一个车牌定位系统。但该方法训练十分费时,分类定位的效率也较低。因此当前在目标定位方面,基于深度学习神经网络的方法是主流方法。深度学习的检测算法主要有Mobilene-SSD、YOLO-v5等,利用大批量的标注数据进行训练模型,然后利用训练好的模型进行车牌区域检测。

字符识别
当车牌区域被检测出来后,如何对这一区域中的字符进行识别,主要有两种思路:
【方法1】首先利用一系列字符分割的算法将车牌中的字符逐个分开,然后基于深度学习进行字符分类,得到识别结果;
【方法2】直接对车牌区域采用端到端的网络进行识别。

本文我们直接基于网络上开源的HyperLPR 高性能开源中文车牌识别框架,来进行车牌区域与字符识别,该方法支持支持python3,支持Windows Mac Linux 树莓派等。
具体使用方法如下:
【1】导入第三方库OpenCV和hyperlpr,并读取一张车牌图片调用架构中的车牌识别方法获得结果,示例代码如下:

#导入包
from hyperlpr import *
#导入OpenCV库
import cv2
#读入图片
image = cv2.imread("2.jpg")
#识别结果
print(HyperLPR_plate_recognition(image))

代码运行结果如下,包含了车牌字符:'京EL0662'置信度值:0.9737052321434021、车牌位置坐标:[255, 196, 367, 236]、图片尺寸形状:【3, 518, 690】(3通道,高518,宽690)信息。

(1, 3, 518, 690)
255 196 367 236
[['京EL0662', 0.9737052321434021, [255, 196, 367, 236]]]

下面我们将车牌的识别结果信息显示在图片上,代码如下:

# coding:utf-8
# 导入包
from hyperlpr import *
# 导入OpenCV库
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np

# 定义画图函数
def drawRectBox(image, rect, addText, fontC):
    """
    车牌识别,绘制矩形框与结果
    :param image: 原始图像
    :param rect: 矩形框坐标
    :param addText:车牌号
    :param fontC: 字体
    :return:
    """
    # 绘制车牌位置方框
    cv2.rectangle(image, (int(round(rect[0])), int(round(rect[1]))),
                 (int(round(rect[2]) + 15), int(round(rect[3]) + 15)),
                 (0, 0, 255), 2)
    # 绘制字体背景框
    cv2.rectangle(image, (int(rect[0] - 1), int(rect[1]) - 25), (int(rect[0] + 120), int(rect[1])), (0, 0, 255), -1, cv2.LINE_AA)
    img = Image.fromarray(image)
    draw = ImageDraw.Draw(img)
    draw.text((int(rect[0] + 1), int(rect[1] - 25)), addText, (255, 255, 255), font=fontC)
    imagex = np.array(img)
    return imagex

# 读取选择的图片
image = cv2.imread('2.jpg')
all_res = HyperLPR_plate_recognition(image)
# 车牌标注的字体
fontC = ImageFont.truetype("Font/platech.ttf", 20, 0)
# all_res为多个车牌信息的列表,取第一个车牌信息
lisence, conf, boxes = all_res[0]
image = drawRectBox(image, boxes, lisence, fontC)
cv2.imshow('RecognitionResult', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码运行结果如下,可以看到车牌信息与方框被很好的标注在了图片上:
在这里插入图片描述
但是,在生活中,我们更多用到的是从视频中对车牌进行识别,因此我们只需要对视频的每一帧图片进行车牌识别检测,然后将检测信息绘制上去即可,核心代码如下:

# 读取摄像头
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
# 车牌标注的字体
fontC = ImageFont.truetype("Font/platech.ttf", 20, 0)

while True:
    ref, frame = cap.read()
    if ref:
        # 识别车牌
        all_res = HyperLPR_plate_recognition(frame)  
        if len(all_res) > 0:
            lisence, conf, boxes = all_res[0]  
            frame = drawRectBox(frame, boxes, lisence, fontC)
        cv2.imshow("RecognitionResult", frame)  
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break  # 退出
    else:
        break

识别结果如下:
在这里插入图片描述

以上便是关于车牌识别的基本原理介绍与代码演示。基于该车牌识别技术,最终博主经过长时间开发,总共干了近3000行代码,并且整个系统经过了详细的调试修改。最终开发了本文介绍的车牌识别停车场管理系统软件pythonPYQT5]】,能够基于车牌识别很好的实现进出停车场车辆车牌自动识别车牌登记信息录入已登记车辆有效期时间管理车辆进出记录管理以及外来车辆收费系统等功能。

关于该停车系统的涉及到的完整源码、UI界面代码等相关文件,均已打包上传,感兴趣的小伙伴可以通过下载链接自行获取。

【获取方式】

关注文末GZH名片【阿旭算法与机器学习】,回复【车牌识别】可获取下载方式

本文涉及到的完整全部程序文件:包括python源码、UI文件、测试图片、视频等文件(见下图),均已打包上传,按说明配置好环境后,点击运行即可。

【pycharm打开项目界面如下】
在这里插入图片描述
文件夹下的资源显示如下图:
在这里插入图片描述

注意:该代码采用Pycharm+Python3.8开发,运行界面的主程序为main.py(不含登录界面);login_main.py(含登录界面)。为确保程序顺利运行,请按照环境配置.txt配置软件运行环境。

关注下方GZH名片【阿旭算法与机器学习】,回复【车牌识别】可获取下载方式


结束语

以上便是博主开发的关于基于OpenCV车牌识别停车场管理系统的全部内容,由于博主能力有限,难免有疏漏之处,希望小伙伴能批评指正
关于本篇文章大家有任何建议或意见,也欢迎在评论区留言交流!

觉得不错的小伙伴,感谢点赞、关注加收藏哦!更多干货内容持续更新…

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42589613/article/details/131087348

智能推荐

网络故障和网络诊断工具(1.0)_网络诊断工具支持从公网向私网的网络诊断工具发起诊断测试-程序员宅基地

文章浏览阅读8.3k次,点赞6次,收藏41次。网络故障概述在信息化社会里,各企事业单位对网络的依赖程度越来越高,网络随时都可能发生故障,影响正常工作。所以,必须掌握相应的技术及时排除故障。有些单位如电信、电子商务公司、游戏运营商等使用的网络一旦发生故障,若不能及时排除,会产生很大的损失。这些单位一般会安装网络故障管理软件,通过软件来管理和排除网络的故障。从网络故障本身来说,经常会遇到的故障有:物理层故障数据链路层故障网络层故障以太网络故障广域..._网络诊断工具支持从公网向私网的网络诊断工具发起诊断测试

Pixhawk原生固件PX4之日期时间的确定_px4日志日期未知-程序员宅基地

文章浏览阅读2.5k次。19701.1 00:00:00年到2000.1.1 00:00:00有多少秒?软件中哪里给的默认时间2000年的?_px4日志日期未知

Ogre射线精确查询_ogre射线准确求交-程序员宅基地

文章浏览阅读736次。bool PickEntity(Ogre::RaySceneQuery* mRaySceneQuery, Ogre::Ray &ray, Ogre::Entity **result, Ogre::uint32 mask ,Ogre::Vector3 &hitpoint, bool excludeInVisible,const Ogre::String& excludeobject, Ogre::R_ogre射线准确求交

/usr/lib/x86_64-linux-gnu/libopencv_highgui.so:对‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定义的引用...-程序员宅基地

文章浏览阅读489次。LIBRARIES+=boost_threadstdc++boost_regexhttps://github.com/rbgirshick/fast-rcnn/issues/52转载于:https://www.cnblogs.com/huhuai/p/10624740.html_/usr/lib/x86_64-linux-gnu/libopencv_highgui.so: undefined reference to `tiff

人大金仓数据库KingbaseES dbms_xmlquery包使用技巧--集合元素处理方式_数据库中的xml数据怎么改-程序员宅基地

文章浏览阅读842次,点赞22次,收藏19次。在目前的KingbaseES的使用过程中,我们会遇到数据库需要存储XML格式的数据,或者需要对查询的数据进行转换的问题,XML格式的数据类似于HTML格式数据,XML是一种扩展标记语言,最早于1998年被引入软件工业界,它不仅可以在WEB前端使用还可以应用于后端数据处理以及数据库存储等。_数据库中的xml数据怎么改

rtc-sfu_rtc sfu-程序员宅基地

文章浏览阅读581次。SFU 的全称是:Selective Forwarding Unit,是一种通过服务器来路由和转发 WebRTC 客户端音视频数据流的方法。如图所示,SFU 服务器最核心的特点是把自己 “伪装” 成了一个 WebRTC 的 Peer 客户端,WebRTC 的其他客户端其实并不知道自己通过 P2P 连接过去的是一台真实的客户端还是一台服务器,我们通常把这种连接称之为 P2S,即:Peer to Server。_rtc sfu

随便推点

从最佳并发用户数和最大并发用户数看性能测试_激活用户数,最大并发-程序员宅基地

文章浏览阅读5k次,点赞2次,收藏9次。从最佳并发用户数和最大并发用户数看性能测试原文地址:http://www.cnblogs.com/jackei/archive/2006/11/20/565527.html文章中介绍一个理发店理论,然后引出最佳并发用户数和最大并发用户数的概念 背景:理发店共有3名理发师,每名理发师完成一次理发都耗时1小时,店里有还有一些位子供客人等位,每个客人在_激活用户数,最大并发

linux中crontab定时执行脚本_cron 每周日凌晨6点执行-程序员宅基地

文章浏览阅读6.4k次。阅读目录1. cron服务【Ubuntu环境】 2. crontab用法 3. 编辑crontab文件 4. 流程举例 5. 几个例子Linux中,周期执行的任务一般由cron这个守护进程来处理。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为“crontab”,是“cron table”的简写。回到顶部1. cron服务【Ubu..._cron 每周日凌晨6点执行

时间序列入门学习-02 常用统计学概念及公式-程序员宅基地

文章浏览阅读77次。学习过程中涉及很多统计学公式,然而过去快10年,忘得一干二净,借此文复习一下叭~

CAD异常eNotOpenForWrite-程序员宅基地

文章浏览阅读6.6k次,点赞2次,收藏2次。之前在实际工程中查一个软件崩溃的问题,具体调试到的位置是AcDbDatabase::saveAs函数,应该是将数据库保存回CAD图纸时触发了CAD的"eNotOpenForWrite"报错随后软件崩溃。根据以往的使用情况来看,saveAs函数一般不会导致CAD的报错,且在具体测试后,确定只有该工程中一张特定图纸打开时,调用功能会导致异常发生。其他图纸操作一切正常,包括在打开其他图纸的情况下,对该特_enotopenforwrite

Android10系统中dialog.isShowing返回false问题-程序员宅基地

文章浏览阅读1.6k次。问题现象: 伪代码 使用流程 AcrtivityA– > DialogFragment– > ActivityB– > back to ActivityA { if ( getDialog().isShowing() ){ DialogFragment.dismiss()} } 发现Android9系统环境下 BaseJDDialogFragment调用getDialog().isShowing,返回为true,而Android10系..._android10系统中dialog.isshowing返回false问题

Snipaste 截图工具快捷键大全_snipaste截图快捷键-程序员宅基地

文章浏览阅读1.5k次。下载地址 f1 截图 c 复制_snipaste截图快捷键