基于华为云车牌识别服务设计的停车场计费系统【华为开发者空间】

举报
DS小龙哥 发表于 2024/12/16 09:44:38 2024/12/16
【摘要】 本项目基于华为云提供的车牌识别服务,设计并实现了一套高效、智能的停车场计费系统,成功完成了车辆进出自动识别、停车时间记录、费用计算、数据存储与查询等核心功能。借助华为开发者空间的云主机和开发工具,结合Python的强大生态和PyQt5的优秀界面开发能力,项目实现了从需求分析到系统部署的完整流程。

 

手把手的技术干货教程,记录从0到1的开发过程。

一、前言

1.1 内容简介

随着城市化进程的不断加快,私家车数量迅猛增长,停车场管理面临着巨大的压力。传统的人工管理方式效率低下,容易出现疏漏,不仅浪费了人力资源,还导致了用户体验的下降。在这种背景下,智能化停车场管理系统应运而生,为提升停车场的运营效率和用户服务质量提供了可能。

近年来,车牌识别技术作为智能停车场的重要组成部分,得到了广泛应用。通过自动识别车辆的车牌信息,可以实现车辆的快速进出场记录与管理,有效减少人工干预,提高效率。结合云计算技术,车牌识别系统可以进一步实现数据的集中处理和管理,为停车场的计费、安防等功能提供强大的技术支撑。

华为云作为国内领先的云计算服务提供商,其提供的车牌识别服务具备高效、精准的特点,能够满足停车场系统对实时性和可靠性的要求。通过华为开发者空间的云主机,开发者可以快速部署应用,利用云端强大的计算能力和稳定的环境,降低开发难度,提高开发效率。

本项目利用华为云的车牌识别服务,设计并实现一个停车场自动计费系统。通过对车辆进入和离开时间的记录和识别,系统能够自动计算停车费用,减少人工干预,提升用户体验。项目采用Python语言进行开发,结合PyQt5进行用户界面设计,为系统提供简洁友好的操作界面,同时依托Ubuntu操作系统的稳定性和开放性,确保系统运行的高效性和安全性。

当前项目的工程源码文件已经陆续更新到网盘:

https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

下面是运行效果

【1】加载图片测试阶段

image-20241215014854428image-20241215014946761

【2】实时视频测试阶段

image-20241215015301529

1.2 云主机

这里使用的华为云开发者空间云主机,是华为云为全球开发者打造的一个云端开发环境,简化开发流程、提高开发效率,并促进技术创新。这个平台提供了一个无需成本即可探索和使用华为云服务的机会,每位注册的开发者在年度内都能享有数百小时的云主机使用权。云主机预装了CodeArts IDE(华为云的集成开发环境)、代码仓库以及JDK、Python等关键运行时插件,从而避免了本地环境配置的复杂性,让开发者能够快速上手并立即开始工作。

除了云主机外,华为云还提供了5GB的云存储容量及定制化的场景模拟沙箱,这些资源帮助开发者在安全隔离的环境中进行实验和测试。华为云开发者空间提供了丰富的技术培训课程和专业认证资料,助力开发者提升技能,并通过认证来证明自己的能力。该空间特别注重于应用全周期管理,涵盖从应用构建到运维的全过程,确保开发者可以高效地完成云端应用搭建。

华为云开发者空间云主机围绕CodeArts IDE打造了一个全面的开发工具生态系统,整合了鲲鹏、昇腾、鸿蒙等核心生态的开发资源,提供广泛的开源软件库和实用开发插件,支持从代码托管到应用运维的各个阶段。这不仅提升了开发效率,也方便了开发者与华为先进技术和全球开发者社区互动,共同推动技术进步和应用创新。

华为云开发者空间云主机的操作系统版本为Ubuntu 22.04.4 LTS,并且内置了一些常用的应用程序如Gitcode等,为开发者提供了一个稳定而高效的开发环境。

1.3 开发环境

本项目的开发环境主要依托华为开发者空间提供的云主机环境进行设计与实现,以下是开发环境的详细说明:

(1)云主机环境:华为开发者空间 华为开发者空间是华为云为全球开发者提供的一个云端开发环境,旨在帮助开发者快速构建、测试和部署应用。云主机具有高性能的计算能力、灵活的扩展性以及安全稳定的运行环境,适合各种开发需求。在本项目中,云主机作为停车场计费系统的运行平台,提供了便捷的资源管理和稳定的服务支持。

(2)操作系统:Ubuntu 22.04.4 云主机的操作系统选择了Ubuntu 22.04.4,这是目前广泛使用的Linux发行版之一。Ubuntu以其高度的稳定性、安全性以及丰富的软件包支持而闻名,非常适合开发者在云端环境中进行开发和部署。Ubuntu 22.04.4版本支持最新的开发工具和库,确保开发者能够利用最新的技术和功能构建项目。

(3)开发语言:Python 本项目采用Python作为开发语言。Python以其简单易用、功能强大以及丰富的库生态而受到广泛欢迎,尤其适合人工智能、数据处理和自动化任务的开发。在本项目中,Python不仅用于调用华为云提供的车牌识别服务API,还负责处理停车场进出车辆数据的管理、费用计算逻辑的实现以及与用户界面的交互。

(4)用户界面:PyQt5 项目的用户界面设计采用了PyQt5,这是一个基于Qt框架的Python库,用于开发跨平台的桌面图形用户界面。PyQt5提供了丰富的组件和功能,可以快速构建交互性强、界面美观的桌面应用。在本项目中,PyQt5被用来设计停车场计费系统的用户界面,包括车辆信息显示、计费结果展示和操作按钮等,为用户提供了直观易用的交互体验。

(4)代码编辑和调试:CodeArts IDE

CodeArts IDE是华为开发者空间云主机自带的在线开发环境。

  •  零配置开发环境:CodeArts IDE已预装Python开发工具和相关依赖,开箱即用,开发者无需额外配置环境。
  •  集成功能:提供代码补全、调试器、版本控制等功能,大大提高开发效率。

1.4 功能说明

功能需求:

  • • 自动记录车辆进出时间。
  • • 实现停车费用的自动计算和展示。
  • • 支持数据存储与历史记录查询。

系统架构:

  • • 前端界面:基于PyQt5,提供车辆信息展示和操作界面。
  • • 后端逻辑:采用Python处理车牌识别、计费计算和数据管理。
  • • 云端支持:调用华为云车牌识别API完成车牌信息提取,使用云存储保存停车数据。

硬件集成。最终可以与闸机联动,完成缴费自动抬杆。

二、华为云开发者空间

这一个章节介绍华为云主机的配置与使用。

2.1 进入开发者空间

链接地址:  https://developer.huaweicloud.com/space/devportal/desktop

登录华为云账号,进去之后看到的页面如下:

image-20241128112456710

2.2 配置云主机

在左上角可以看到云主机的配置提醒,目前默认是基础版。

image-20241128112719601

点击配置云主机,会弹出对话框,让你选择云主机的配置,进行安装系统。我这里选择ubuntu 22.04.

image-20241128112849373

2.3 安装系统

点击安装后,会进行安装系统。需要等等一段时间。

image-20241128112946066image-20241128113018917

2.4 启动云主机

安装完毕之后,直接可以在浏览器里启动云主机。

image-20241128115019990

启动需要一段时间初始环境。

image-20241128115003882

进去之后会有引导界面,提示云主机的使用技巧。

image-20241128115120299

进入桌面后的默认效果如下。

image-20241128132247230

2.5 全屏切换

在桌面页面上有个按钮可以全屏切换,切换全屏后,可视化空间更大,开发更加方便。

image-20241128132652870

2.6 共享桌面

云主机还有共享桌面功能,如果需要远程演示项目,共享开发过程,对方还可以远程操作,这个功能非常的方便。 直接双击666 

image-20241128132902031

2.5 测试Python开发环境

点击左下角的所有应用程序,可以看到开发菜单里,有安装好的Python环境,可以直接使用。

image-20241128133211189

启动之后的效果如下。

image-20241128133407115

进去之后,点击左上角,新建一个文件。

image-20241128133738010

然后保存文件,名字叫:test.py

image-20241128134016923image-20241128134054067

然后编写一段简单的python代码,测试当前的开发环境是否正常。

image-20241128134212194

代码如下:

import socket

def get_local_ip():
    """
    获取本地 IP 地址
    """
    try:
        # 创建一个 socket 对象,并连接到一个公共地址
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        local_ip = s.getsockname()[0]
        s.close()
        return local_ip
    except Exception as e:
        return f"无法获取本地 IP 地址: {e}"

if __name__ == '__main__':
    print("本地 IP 地址是:", get_local_ip())

点击左上角运行。

image-20241128134259768

结果如下:

image-20241128134333622

2.6 安装requests库

接下来需要使用Python代码的requests库,发起HTTP请求。先提前安装环境。

image-20241128144050189

2.7 安装Pillow库

Pillow  PIL(Python Imaging Library)的一个分支,提供了图片处理功能。

pip3 install Pillow

image-20241128230449973

到此,云主机的开发环境已经测试OK。

三、车牌服务使用

本章节讲解,完整调用车牌识别服务接口,应该怎么做。

3.1 项目凭证

接下来调用车牌服务的API接口,都需要token进行鉴权,需要使用项目凭证 这个参数。

【1】获取项目凭证 点击左上角用户名,选择下拉菜单里的我的凭证。 记住这个项目ID,后面会用到。

image-20241128141601764

3.2 创建IAM账户

创建一个IAM账户,因为接下来使用人脸服务的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。

地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users

鼠标放在左上角头像上,在下拉菜单里选择统一身份认证

image-20241111111454853

点击右上角创建用户

填写用户名和密码信息:

image-20241028150247054

继续点击下一步:

image-20241028150339739

然后点击创建用户

image-20241028150407852

创建成功:

image-20241028150432765

创建完成

image-20241111111554099

用户信息如下:

主用户名  xiao_ping_ping
IAM用户  ds_abc
密码     DS12345678

3.3 获取token鉴权

【1】Token介绍

为了方便接下来调用华为云的API接口,这里先完成token参数的获取。

帮助文档:https://support.huaweicloud.com/api-iam/iam_30_0001.html

image-20241128142121839

获取的Token有效性说明:

Token的有效期为24小时。建议进行缓存,避免频繁调用。使用Token前请确保Token离过期有足够的时间,防止调用API的过程中Token过期导致调用API失败。重新获取Token,不影响已有Token有效性。

image-20241128142220806

【2】接口使用说明

在文档页面,向下翻,可以看到对于此接口的详细说明。还支持使用在线调试。

image-20241128142459385

【3】编写代码获取token

import requests
import json

# 主账号用户名
MAIN_USER = "[填你自己的]"

# IAM 子账户用户名
IAM_USER = "[填你自己的]"

# IAM 子账户密码
IAM_PASSWORD = "[填你自己的]"

# 项目 ID
PROJECT_ID = "[填你自己的]"

# 服务器区域代号
SERVER_ID = "cn-north-4"

# 保存 TOKEN 的文件路径
TOKEN_FILE_PATH = "token.txt"

def get_token():
    """
    功能: 获取 TOKEN 并保存到本地文件
    """
    # 请求地址
    request_url = f"https://iam.{SERVER_ID}.myhuaweicloud.com/v3/auth/tokens"

    # 构造请求头
    headers = {
        "Content-Type": "application/json;charset=UTF-8"
    }

    # 构造请求体
    payload = {
        "auth": {
            "identity": {
                "methods": ["password"],
                "password": {
                    "user": {
                        "domain": {
                            "name": MAIN_USER
                        },
                        "name": IAM_USER,
                        "password": IAM_PASSWORD
                    }
                }
            },
            "scope": {
                "project": {
                    "name": SERVER_ID
                }
            }
        }
    }

    # 发出 POST 请求
    try:
        response = requests.post(request_url, headers=headers, data=json.dumps(payload))

        # 打印状态码
        print(f"状态码: {response.status_code}")

        if response.status_code == 201:
            # 读取 X-Subject-Token 响应头
            token = response.headers.get("X-Subject-Token")

            # 打印返回的数据和 Token
            print(f"反馈的数据: {response.json()}")
            print(f"Token: {token}")

            # 保存 TOKEN 到本地文件
            if token:
                save_token_to_file(token)
                print(f"TOKEN 已保存到 {TOKEN_FILE_PATH}")
            else:
                print("未能获取到 TOKEN")
        else:
            print(f"获取 TOKEN 失败: {response.text}")

    except Exception as e:
        print(f"请求发生错误: {e}")

def save_token_to_file(token):
    """
    保存 TOKEN 到本地文件
    """
    try:
        with open(TOKEN_FILE_PATH, "w") as file:
            file.write(token)
    except Exception as e:
        print(f"保存 TOKEN 时发生错误: {e}")

def main():
    # 获取 TOKEN
    get_token()

if __name__ == "__main__":
    main()

代码说明:

(1)依赖库:使用requests库发起 HTTP 请求。 如果没有安装,在运行代码前安装依赖库:

pip install requests

(2)主要逻辑:构造请求头和请求体。发起 POST 请求,获取响应。从响应头中提取 X-Subject-Token 并保存到本地文件。

(3)TOKEN 保存: TOKEN 被保存到 token.txt 文件中,方便后续直接读取使用。

(4)运行方式: 将代码保存为get_token.py,可以通过命令运行:

python get_token.py

也可以直接在终端运行,更加方便。 代码编写完毕,点击右上角的绿色三角形按钮,运行。 得到了Token然后保存到本地文件里。

image-20241128144526555

3.4 开通车牌识别服务

链接地址: https://console.huaweicloud.com/ocr/?region=cn-north-4#/ocr/overview

点击开通车牌识别服务。

image-20241215003229022

用户点击全部选择,点击批量开通。

开通之后。

image-20241215003654458

3.5 接口文档

在控制台页面中,可以看到每个功能都有一个接口文档按钮,点击可以一键翻到对应的帮助文档页面。快速了解此功能的使用办法。

image-20241215003742524

产品文档的地址: https://support.huaweicloud.com/api-ocr/ocr_03_0040.html

向下翻,可以看到此接口如何调用,需要传入什么参数。

在下面可以看到一个请求参数的说明。第一个参数是:X-Auth-Token,这个很重要,调用华为云的API接口都需要填这个参数。 关于如何获取这个X-Auth-Token参数。 下面章节里会详细介绍。

image-20241215003849522

【1】接口

POST /v2/{project_id}/ocr/license-plate

参数 是否必选 说明
endpoint 华北-北京四”区域的endpoint为ocr.cn-north-4.myhuaweicloud.com
project_id 项目ID,可以从获取项目ID中获取。

【2】请求参数

参数 是否必选 参数类型 描述
X-Auth-Token String 用户Token。用于获取操作API的权限。获取Token接口响应消息头中X-Subject-Token的值即为Token。
Content-Type String 发送的实体的MIME类型,参数值为“application/json”。
参数 是否必选 参数类型 说明
image String 图片的Base64编码,要求Base64编码后大小不超过10MB。图片最短边不小于15px,最长边不超过4096px,支持JPEG、JPG、PNG、BMP、TIFF格式。图片Base64编码示例如/9j/4AAQSkZJRgABAg...,带有多余前缀会产生The image format is not supported报错。

【3】响应参数

根据识别的结果,可能有不同的HTTP响应状态码(status code)。例如,200表示API调用成功,400表示调用失败,详细的状态码和响应参数说明如下。

状态码: 200

参数 参数类型 描述
result Array of LicensePlateResult objects 识别结果。调用失败时不返回此字段。
参数 参数类型 描述
plate_number String 车牌内容。
plate_color String 当前版本支持的车牌底色类型:blue:蓝色green:绿色(小型新能源车牌)black:黑色white:白色yellow:黄色yellow_green: 黄绿(大型新能源车牌)
plate_location Array of integers 车牌的区域位置信息,列表形式,包含文字区域四个顶点的二维坐标(x,y);采用图像坐标系,坐标原点为图片左上角,x轴沿水平方向,y轴沿竖直方向。
confidence Float 字段的置信度,取值范围0~1。置信度越大,本次识别的字段的可靠性越高,在统计意义上,置信度越大,准确率越高。置信度由算法给出,不直接等价于字段的准确率。

状态码: 400

参数 参数类型 说明
error_code String 调用失败时的错误码。调用成功时不返回此字段。
error_msg String 调用失败时返回的错误信息。调用成功时不返回此字段。

3.6 准备车牌

直接打开浏览器,网络上找几张车牌图片下载下来备用。

image-20241215005716753

下载几张下来。

image-20241215005750162

为了方便访问路径,这里先给图片改个名字。

image-20241215005813687

3.6 编写代码实测

【1】完整源代码

代码读取 token.txt 文件中的 Token、将图片进行 Base64 编码并通过 requests 库发送 HTTP POST 请求到车牌识别接口。

import base64
import requests
import os

# 从文件中读取Token
def read_token():
    try:
        with open("token.txt", "r") as file:
            token = file.read().strip()
        return token
    except FileNotFoundError:
        print("Error: token.txt file not found!")
        return None

# 将图片转换为Base64编码
def image_to_base64(image_path):
    try:
        with open(image_path, "rb") as image_file:
            base64_image = base64.b64encode(image_file.read()).decode("utf-8")
        return base64_image
    except FileNotFoundError:
        print(f"Error: Image file {image_path} not found!")
        return None

# 车牌识别函数
def car_distinguish(image_path):
    SERVER_ID = "cn-north-4"
    PROJECT_ID = "ff981a50957a403cb68d906e0d424eed"
    token = read_token()

    if not token:
        return

    # 设置请求地址
    request_url = f"https://ocr.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/ocr/license-plate"

    # 编码图片
    img_data = image_to_base64(image_path)
    if not img_data:
        return

    # 构造请求头
    headers = {
        "Content-Type": "application/json;charset=UTF-8",
        "X-Auth-Token": token
    }

    # 构造请求参数
    payload = {
        "image": img_data
    }

    # 发送POST请求
    try:
        response = requests.post(request_url, json=payload, headers=headers)

        # 处理响应
        if response.status_code == 200:
            print("Request successful!")
            print("Response Data:", response.json())
        else:
            print(f"Request failed with status code {response.status_code}")
            print("Response:", response.text)
    except requests.RequestException as e:
        print("Error during the request:", e)

# 测试代码
if __name__ == "__main__":
    # 替换为你的图片路径
    image_path = "/home/developer/Downloads/1.jpeg"
    car_distinguish(image_path)

【2】代码功能解释

(1)read_token 函数 从当前目录下的 token.txt 文件读取 Token。如果文件不存在,打印错误信息。

(2)image_to_base64 函数 将指定路径的图片转换为 Base64 编码。需要确保图片文件大小不超过 2MB。

(3)car_distinguish 函数

  • • 构造 API 的 URL 和请求头。
  • • 将图片进行 Base64 编码,并作为 POST 请求的参数发送到华为云 OCR 服务。
  • • 处理并打印返回结果。如果请求失败,会打印相应的错误消息。

(4)依赖 需要安装 requests 库,可以通过以下命令安装:

pip install requests

(5)如何运行  token.txt 文件放在同一个目录下,和 修改测试的图片的路径,然后运行该脚本。

3.7 运行结果

运行代码可以看到已经识别出结果。

image-20241215005956392

运行结果如下:

{'result': [{'plate_number': '京A88888', 'plate_color': 'blue', 'confidence': 0.9999, 'plate_location': [[25, 164], [634, 168], [633, 334], [24, 330]]}]}

从返回值就可以看到,车牌已经解析出来了。

四、图形化界面开发

4.1 安装PyQt5

为了方便能直观的展示项目的整体功能,接下来安装PyQt,完成车牌计费系统的系列功能的设计。

在Python中安装PyQt库非常简单,可以使用pip这个包管理工具来完成。PyQt有两个主要版本:PyQt5(基于Qt 5)和PyQt6(基于Qt 6)。

我这里安装Qt5,以Qt5为例进行开发。

要安装PyQt5,打开命令行界面,然后运行以下命令:

pip install PyQt5

安装过程中:

image-20241128222327822

安装完毕。

image-20241128222708039

4.2 安装QtDesigner

如果想使用PyQt5的设计工具(Qt Designer),用图形方式设计界面,可以安装pyqt5-tools

pip install pyqt5-tools

安装过程如下:

image-20241128222745062

安装过程中

image-20241128223523710

安装完毕。

image-20241128224259036

4.3 测试Qt环境

安装完成后,先写一份测试代码,创建一个窗口,运行测试Qt环境是否正常。

新建一个文件:hello_pyqt.py

image-20241128224337337

编写代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QWidget  # 如果使用PyQt6,这里改为 from PyQt6.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)

window = QWidget()
window.setWindowTitle('Hello PyQt')
window.show()

sys.exit(app.exec_())

在终端命令行中运行:

python3 hello_pyqt.py

如果一切正常,应该能看到一个标题为Hello PyQt的空白窗口。这表明PyQt已经成功安装并且可以正常使用了。

运行效果如下:

image-20241215002633330

4.4 编写车牌识别代码

下面是基于PyQt5 的设计的完整代码。

包含一个图形界面,具备加载图片和识别车牌功能。界面布局中,左侧显示加载的图片,右侧显示车牌识别的结果。

import sys
import base64
import requests
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QHBoxLayout, QWidget, QFileDialog, QTextEdit
)
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt


# 从文件中读取Token
def read_token():
    try:
        with open("token.txt", "r") as file:
            token = file.read().strip()
        return token
    except FileNotFoundError:
        print("Error: token.txt file not found!")
        return None


# 将图片转换为Base64编码
def image_to_base64(image_path):
    try:
        with open(image_path, "rb") as image_file:
            base64_image = base64.b64encode(image_file.read()).decode("utf-8")
        return base64_image
    except FileNotFoundError:
        print(f"Error: Image file {image_path} not found!")
        return None


# 车牌识别函数
def recognize_license_plate(image_path):
    SERVER_ID = "cn-north-4"
    PROJECT_ID = "ff981a50957a403cb68d906e0d424eed"
    token = read_token()

    if not token:
        return "错误:无法读取Token文件。"

    # 设置请求地址
    request_url = f"https://ocr.{SERVER_ID}.myhuaweicloud.com/v2/{PROJECT_ID}/ocr/license-plate"

    # 编码图片
    img_data = image_to_base64(image_path)
    if not img_data:
        return "错误:无法对图片进行Base64编码。"

    # 构造请求头
    headers = {
        "Content-Type": "application/json;charset=UTF-8",
        "X-Auth-Token": token
    }

    # 构造请求参数
    payload = {
        "image": img_data
    }

    # 发送POST请求
    try:
        response = requests.post(request_url, json=payload, headers=headers)

        # 处理响应
        if response.status_code == 200:
            return response.json()
        else:
            return f"请求失败,状态码:{response.status_code}\n响应内容:{response.text}"
    except requests.RequestException as e:
        return f"请求过程中发生错误:{e}"


# 主窗口类
class LicensePlateRecognizer(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("车牌识别")
        self.setGeometry(100, 100, 800, 600)

        # 创建主布局
        main_layout = QHBoxLayout()

        # 左侧布局:显示图片
        self.image_label = QLabel("未加载图片")
        self.image_label.setAlignment(Qt.AlignCenter)
        self.image_label.setStyleSheet("border: 1px solid black;")
        self.image_label.setFixedSize(300, 400)
        main_layout.addWidget(self.image_label)

        # 中间布局:按钮
        button_layout = QVBoxLayout()
        self.load_button = QPushButton("加载图片")
        self.load_button.clicked.connect(self.load_image)
        button_layout.addWidget(self.load_button)

        self.recognize_button = QPushButton("识别车牌")
        self.recognize_button.clicked.connect(self.recognize_image)
        button_layout.addWidget(self.recognize_button)

        button_layout.addStretch()
        main_layout.addLayout(button_layout)

        # 右侧布局:显示结果
        self.result_text = QTextEdit()
        self.result_text.setReadOnly(True)
        self.result_text.setStyleSheet("border: 1px solid black;")
        main_layout.addWidget(self.result_text)

        # 设置中央窗口
        central_widget = QWidget()
        central_widget.setLayout(main_layout)
        self.setCentralWidget(central_widget)

        self.image_path = None  # 存储加载的图片路径

    # 加载图片
    def load_image(self):
        options = QFileDialog.Options()
        file_path, _ = QFileDialog.getOpenFileName(self, "打开图片文件", "", "图片文件 (*.png *.jpg *.jpeg)", options=options)

        if file_path:
            self.image_path = file_path
            pixmap = QPixmap(file_path)
            scaled_pixmap = pixmap.scaled(300, 400, Qt.KeepAspectRatio, Qt.SmoothTransformation)
            self.image_label.setPixmap(scaled_pixmap)
            self.result_text.setText("")  # 清空上次的结果
        else:
            self.image_label.setText("未加载图片")

    # 识别车牌
    def recognize_image(self):
        if not self.image_path:
            self.result_text.setText("错误:未加载图片!")
            return

        self.result_text.setText("识别中...")
        result = recognize_license_plate(self.image_path)

        # 提取并显示结果
        if isinstance(result, dict) and "result" in result:
            try:
                plate_number = result["result"][0]["plate_number"]
                plate_color = result["result"][0]["plate_color"]
                self.result_text.setText(f"车牌号码:{plate_number}\n车牌颜色:{plate_color}")
            except (IndexError, KeyError):
                self.result_text.setText("错误:未能正确解析返回的结果。")
        else:
            self.result_text.setText(str(result))


# 主程序入口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = LicensePlateRecognizer()
    window.show()
    sys.exit(app.exec_())

4.5 运行结果

image-20241215011314008

弹出的界面。

image-20241215011324857

识别的结果。

image-20241215011355381

再换一张车牌。

image-20241215011419461

五、总结

本项目基于华为云提供的车牌识别服务,设计并实现了一套高效、智能的停车场计费系统,成功完成了车辆进出自动识别、停车时间记录、费用计算、数据存储与查询等核心功能。借助华为开发者空间的云主机和开发工具,结合Python的强大生态和PyQt5的优秀界面开发能力,项目实现了从需求分析到系统部署的完整流程。

该系统通过云端车牌识别服务,大幅提升了停车场管理的自动化和智能化水平,不仅降低了人工干预成本,还提高了用户体验。同时,系统支持灵活的计费规则和数据查询功能,为停车场的管理和运营提供了便捷、高效的解决方案。

未来,该系统可进一步扩展,集成移动端应用、在线支付功能以及与硬件设备的联动,构建更完善的智慧停车管理生态体系。项目的完成不仅展示了云服务与本地开发相结合的优势,也为智能化停车场建设提供了一个可行的实施案例。

我正在参加【有奖征集 第34期】华为开发者空间一行代码快速上云,参与视频、文章投稿赢2000元开发者礼包
链接:https://bbs.huaweicloud.com/blogs/438987

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。