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

news2024/11/16 17:35:31

车牌识别基础功能演示

在这里插入图片描述

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

目录

  • 车牌识别基础功能演示
  • 1. 前言
  • 2. 软件核心功能介绍及效果演示
    • 2.1 登录注册功能模块
    • 2.2 车辆信息登记录入功能模块
    • 2.3 车牌识别车辆出入及收费系统模块
    • 2.4 车辆信息数据管理模块
    • 2.5 车辆出入记录模块
  • 3. 车牌识别基本原理介绍
    • 3.1 基本原理
  • 【获取方式】
  • 结束语

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

---

1. 前言

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

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

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

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

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

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FMC子卡设计方案原理图:两路250Msps AD、两路600Msps DA FMC子卡

一、板卡概述 ADC采用TI的ADS62P49,2通道250M,14bit,共1片; DAC采用ADI的AD9122,2通道,16bit,可达1.2G,共1片; 时钟采用AD9516,支持板上时钟和外接时钟…

驱动--自动创建设备节点

自动创建设备节点 头文件&#xff1a;#include <linux/device.h> 自动创建设备节点&#xff1a; struct class *cls; cls class_create(owner, name) /void class_destroy(struct class *cls) 功能&#xff1a;向用户空间提交目录信息 参数&#xff1a; owner :THIS_MOD…

打卡有礼!快来 2023 开放原子全球开源峰会找龙蜥玩~

回望过去&#xff0c; 2022 年开放原子全球开源峰会上&#xff0c;龙蜥社区携新一届理事成员以及 18 位产学研大咖重磅亮相&#xff0c;社区论坛及展区更是吸引了近 1400 位参会者参与互动&#xff0c;现场热闹非凡。再看今朝&#xff0c;2023 年开放原子全球开源峰会举办在即&…

淘宝618每日一猜答案(6月8日)明星孙怡最喜欢的显瘦单品?

淘宝6月8日每日一猜答案是什么&#xff1f;&#xff0c;接下来也会给大家来介绍一下6月8日淘宝大赢家每日一猜的答案。 淘宝每日一猜6月8日答案分享 活动问题&#xff1a;明星孙怡最喜欢的显瘦单品&#xff1f; 活动答案&#xff1a;【鲨鱼裤】 还有打开手机淘宝&#xff0c…

Java 高效处理千万级数据:技巧与最佳实践

引言 这篇文章主要为大家简单介绍 Java 如何处理千万级数据&#xff0c; 随着大数据时代的到来&#xff0c;数据量持续呈现爆炸式增长。在这种背景下&#xff0c;如何快速、高效地处理和分析千万级甚至更大规模的数据&#xff0c;成为企业和开发者面临的重要挑战。处理大数据…

通过Typora,以CSDN作为图床、解决CSDN防盗链问题、将CSDN博客搬到hexo上

完美将csdn的md(包括图片)复制到hexo上 其实主要就是复制图片&#xff0c;因为csdn有防盗链&#xff0c;自己的hexo上不能拉取csdn上的图片资源 1. 安装Typora Typora作为本地的md编辑器&#xff0c;有在复制网络图片时&#xff0c;直接将其保存到本地的能力&#xff0c;我们…

集权攻防——身份认证协议之NTLM

在Kerberos出现之前&#xff0c;NTLM被广泛应用于工作组和域环境&#xff0c;是更早的用于对用户进行身份验证的协议。 相比于Kerberos&#xff0c;NTLM的认证原理比较简单&#xff0c;主要通过对比客户端和服务端加密后的数据&#xff0c;判断其是否一致&#xff0c;以确定用…

浅析Spring生命周期

前言 Spring框架是一个非常流行的Java企业级应用程序框架&#xff0c;已经成为许多生产环境中的首选技术。它提供了一种便捷的方法来帮助开发人员构建可扩展和模块化的企业级应用程序。在Spring框架中&#xff0c;Bean生命周期是非常重要的一部分&#xff0c;它负责Bean的创建…

【教程】ChuanhuChatGPT本地化部署支持多语言模型支持上传分析文档附件的GPT

原文&#xff1a;【教程】本地化部署支持多语言模型支持上传分析文档附件的GPT_腾讯新闻 说明 该项目要是为 ChatGPT API 和其他多种语言模型&#xff08;Language Language Models&#xff0c;简称 LLM&#xff09;提供一个用户友好的 Web 图形界面(GUI)。这个项目的 GUI 支…

# 文盘Rust -- tokio绑定cpu实践

作者&#xff1a; jiashiwen 原文来源&#xff1a; https://tidb.net/blog/18804515 notice"Rust is a trademark of the Mozilla Foundation in the US and other countries." tokio 是 rust 生态中流行的异步运行时框架。在实际生产中我们如果希望 tokio 应用程…

AI浪潮下,企业如何保障数据安全,不泄露

随着数字经济蓬勃发展&#xff0c;数据对于企业的价值与重要性不断攀升&#xff0c;随之而来的数据安全风险也不断涌现。再加上ChatGPT诞生&#xff0c;推动ai算力技术大步跃进&#xff0c;而算力提升的背后是史诗量级规模的数据投入&#xff0c;数据量越大&#xff0c;用户数据…

函数调用的机器级表示

文章目录 1.Call和ret指令2. 如何访问栈帧里面的数据为什么栈底放在上面&#xff0c;栈顶放在下面X86中的寄存器EBP、ESP寄存器push 、pop 指令mov 指令总结如何访问栈帧 3. 如何切换栈帧函数调用时函数返回时 4. 完整的函数调用过程1. 一个函数的栈帧内包含哪些内容2. 汇编代码…

配置数据库

&#x1f333;&#x1f333;&#x1f333;前言&#xff1a;下载数据库&#xff0c;安装配置数据库&#xff0c;连接Navicat 又又又重新配置数据库害。 目录 一、下载数据库 二、安装 三、解决3306端口占用 四、验证 五、连接Navicat 一、下载数据库 官方链接&#xff1a;M…

Glibc——堆利用机制[拓展]

目录 1、什么是堆 2、使用动态分配的内存 3、系统调用brk和mmap 3.1 brk() 3.2 mmap() 4、多线程与Arena 5、维护多个堆 1、什么是堆 堆是每个程序被分配到的一块内存区域&#xff0c;和栈的区别主要在于堆内存是动态分配的。也就是说&#xff0c;程序可以从“heap“段请…

LPC1114 - AD采集

一、基础知识 1.1位操作 对寄存器的bit5写0&#xff1a; 寄存器&~&#xff08;1<<5&#xff09;&#xff1b; 现在运用你的C语言知识分析一下&#xff0c;把十进制的1写成二进制32位数就是&#xff1a; 00000000000000000000000000000001 &#xff08;1<<5&…

微服务下如何选择OAuth2授权之四种模式

OAuth2.0是一个授权框架&#xff0c;他规定了客户从授权服务器获取令牌Token的规则。 一、OAuth2的组成部分 1.OAuth2.0需要解决的问题 要理解OAuth2.0&#xff0c;先要知道为什么会有这个东西产生&#xff0c;或者说他能帮我们解决什么问题&#xff0c;其实简单说他就是帮我…

【解决】跨设备访问Ubuntu接口文档,请求超时,ping不通问题

文章目录 一、问题描述二、系统环境三、问题原理说明1. 常见问题原因2. 说说IP 地址和子网掩码不匹配问题 四、有风险的解决方法1. 一般的解决方法&#xff1a;2. 我们的解决方法&#xff1a;第一&#xff1a;第二&#xff1a; 选择网络适配器第三&#xff1a;桥接模式第四&…

js常用的一些技巧【一行】

前言 总结一些常用的&#xff0c;但是一时可能想不起来的一些js小技巧&#xff0c;方便CV 数组 生成数组 当你需要要生成一个0-99的数组 方案1 const createArr (n) > Array.from(new Array(n), (v, i) > i) const arr createArr(100) // 0 - 99 数组方案2 const c…

相同性能和体积的磁体,吸力是一样的吗?

很多小伙伴可能都会有这样一个疑问&#xff0c;相同性能和体积的磁体&#xff0c;它们的吸力一样吗&#xff1f;网上有说钕铁硼磁铁的吸力是自身重量的640倍&#xff0c;这可信吗&#xff1f; 这个问题其实可以发散开&#xff0c;那就是磁铁的吸力与哪些因素有关。首先需要明确…

【已解决】qt4安装包下载含下载链接(完全版)

总所周知&#xff0c;c qt4.8是一个稳定版本&#xff0c;而qt4.8去网上找的我好辛苦&#xff0c;而且官网时而挂机一样&#xff0c;网站崩溃一样&#xff0c;即使找到了&#xff0c;它们也会让你下载qt4.8版本&#xff0c;而那些&#xff0c;比如这里就会显得手足无措。 问题…