python车牌识别计费管理系统 智能停车场 HyperLPR 中文车牌识别框架 OpenCV 深度学习✅


1、项目介绍


技术栈:
Python语言、PyQt5、OpenCV、HyperLPR 中文车牌识别框架、计费功能、车牌识别、停车场计费管理


 2、项目界面


(1)车牌识别进行信息录入


(2)车牌识别---车辆离开、计费功能、停车时长

(3)车牌识别---车辆进入、进入时间、车位数量、剩余车位数、检测车牌号

(4)摄像头检测识别---车辆进入


(5)摄像头检测识别---车辆离开、收费功能、停车时长、车牌号


(6)车辆进出记录管理


(7)车辆信息管理---业主姓名、电话、住址、车牌信息、修改、删除

(8)注册登录功能

 3、项目说明


摘  要
本篇论文研究的是基于车牌识别技术的智能停车场管理系统,采用基于深度学习的车牌识别算法,通过卷积神经网络对车牌图像进行处理和分析,实现车牌字符的识别和车牌信息的提取。同时,本文还设计了一个智能停车场管理系统,包括车位管理、车辆识别、支付管理、数据分析等多个模块,实现了停车场的智能化管理和优化。另外,还讨论了系统的功能需求和非功能需求,以及开发环境和集成开发工具的选择。测试结果表明,停车场车牌识别系统的各个模块均能够正常运行,能够完成车牌识别、车位管理、车辆信息管理等基本功能,并且在高并发情况下能够保持较好的性能表现。本文的研究成果为停车场管理提供了一种智能化的解决方案,具有较高的实用价值和应用前景。


关键词:车牌识别,深度学习,智能停车场,车辆信息管理

 4、部分源码

# encoding:utf-8
import cv2
from PyQt5.QtGui import QPixmap, QImage
import numpy as np
from PIL import Image,ImageDraw,ImageFont
import csv
import pandas as pd
from hyperlpr import *

pd.set_option('mode.chained_assignment', None)

# 车牌标注的字体
fontC = ImageFont.truetype("Font/platech.ttf", 20, 0)

# 绘图展示
def cv_show(name,img):
	cv2.imshow(name, img)
	cv2.waitKey(0)
	cv2.destroyAllWindows()



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

def info_entry_detect(img):
    """
    识别车牌号
    :param img:
    :return:
    """
    res_all = HyperLPR_plate_recognition(img)

    if len(res_all) == 0:
        return img, None, None
    # 车牌号、置信度、车牌区域
    res, conf, boxes = res_all[0]
    image = drawRectBox(img, boxes, res, fontC)
    return image, res, boxes


def img_cvread(path):
    # img = cv2.imread(path)
    img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_COLOR)
    return img


def draw_boxes(img, boxes):
    for each in boxes:
        x1 = each[0]
        y1 = each[1]
        x2 = each[2]
        y2 = each[3]
        cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
    return img


def cvimg_to_qpiximg(cvimg):

    height, width, depth = cvimg.shape
    cvimg = cv2.cvtColor(cvimg, cv2.COLOR_BGR2RGB)
    qimg = QImage(cvimg.data, width, height, width * depth, QImage.Format_RGB888)
    qpix_img = QPixmap(qimg)
    return qpix_img


def save_video():
    # VideoCapture方法是cv2库提供的读取视频方法
    cap = cv2.VideoCapture('C:\\Users\\xxx\\Desktop\\sweet.mp4')
    # 设置需要保存视频的格式“xvid”
    # 该参数是MPEG-4编码类型,文件名后缀为.avi
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    # 设置视频帧频
    fps = cap.get(cv2.CAP_PROP_FPS)
    # 设置视频大小
    size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    # VideoWriter方法是cv2库提供的保存视频方法
    # 按照设置的格式来out输出
    out = cv2.VideoWriter('C:\\Users\\xxx\\Desktop\\out.avi', fourcc, fps, size)

    # 确定视频打开并循环读取
    while (cap.isOpened()):
        # 逐帧读取,ret返回布尔值
        # 参数ret为True 或者False,代表有没有读取到图片
        # frame表示截取到一帧的图片
        ret, frame = cap.read()
        if ret == True:
            # 垂直翻转矩阵
            frame = cv2.flip(frame, 0)

            out.write(frame)

            cv2.imshow('frame', frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break

    # 释放资源
    cap.release()
    out.release()
    # 关闭窗口
    cv2.destroyAllWindows()


# 封装函数:图片上显示中文
def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=50):
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype(
        "simsun.ttc", textSize, encoding="utf-8")
    # 绘制文本
    draw.text(position, text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)


def insert_rows(path, lines ,header):
    """
    将n行数据写入csv文件
    :param path:
    :param lines:
    :return:
    """
    no_header = False
    if not os.path.exists(path):
        no_header = True
        start_num = 1
    else:
        start_num = len(open(path).readlines())

    csv_head = header
    with open(path, 'a', newline='') as f:
        csv_write = csv.writer(f)
        if no_header:
            csv_write.writerow(csv_head)  # 写入表头

        for each_list in lines:
            # 添加序号
            each_list = [start_num] + each_list
            csv_write.writerow(each_list)
            # 序号 + 1
            start_num += 1


def creat_csv(path,header=None):
    """
    创建csv文件
    :param path: 文件路径
    :param header: 文件头
    :return:
    """
    with open(path, 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(header)

def read_csv(path):
    """
    读取csv文件
    :param path:
    :return:
    """
    # data = pd.read_csv(path, sep=',', encoding='gbk', converters={'ID': str})
    data = pd.read_csv(path, sep=',', encoding='gbk')
    return data


def save_csv_data(df, path):
    """
    保存修改后的识别数据
    :param df:
    :param path:
    :return:
    """
    df['序号'] = range(1, len(df) + 1)
    df.to_csv(path, index=False,encoding='gbk')

def get_remaining_num(pd_dada):
    """
    计算剩余车位数
    :param pd_dada:
    :return:
    """
    df1 = pd_dada.groupby(['车辆牌照'])['序号'].count()
    # 数据库中已进入车辆 + 当前进入1辆车
    entry_num = sum(df1 % 2 == 1) + 1
    return entry_num


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值