【Python文字识别】基于HyperLPR3实现车牌检测和识别(Python版本快速部署)

        闲来无事,想复现一下网上的基于YOLO v5的单目测距算法。然后就突然想在这个场景下搞一下车牌识别,于是就有了这篇文章。今天就给大家分享基于HyperLPR3实现车牌检测和识别。

原创作者:RS迷途小书童

博客地址:https://blog.csdn.net/m0_56729804?type=blog

1、HyperLPR3介绍

        HyperLPR3是一个高性能开源中文车牌识别框架,由北京智云视图科技有限公司开发。它是一个基于Python的深度学习实现,用于中文车牌的识别。与开源的EasyPR相比,HyperLPR3在检测速度、鲁棒性和多场景的适应性方面都有更好的表现。

        HyperLPR3支持多种类型的车牌,包括新能源汽车等。其安装和使用都非常方便,可以通过Python的pip工具直接进行安装,并使用命令行工具对本地图像或在线URL进行快速测试。

        此外,HyperLPR3还支持PHP、C/C++、Python语言,以及Windows/Mac/Linux/Android/IOS平台,具有广泛的适用性。

2、HyperLPR3安装

2.1 Github地址

HyperLPR- 基于深度学习高性能中文车牌识别

2.2 快速安装

pip install hyperlpr3

2.3 支持的车牌类别

  • 单行蓝牌
  • 单行黄牌
  • 新能源车牌
  • 教练车牌
  • 白色警用车牌
  • 使馆/港澳车牌
  • 双层黄牌
  • 武警车牌

3、代码

        Github里可以下载各类语言的demo,也有开放的接口可以直接线上检测车牌。我这里基于官方demo写了一份图片和视频的车牌识别代码。

3.1 辅助函数

def draw_plate_on_image(img, box1, text1, font):
    x1, y1, x2, y2 = box1  # 识别框的四至范围
    # random_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2, cv2.LINE_AA)  # 车牌外框
    # cv2.rectangle(img, (x1, y1 - 25), (x2, y1-3), (139, 139, 102), -1)  # 识别文本底色
    data = Image.fromarray(img)  # 读取图片
    draw = ImageDraw.Draw(data)  # PIL绘制图片
    draw.text((x1, y1 - 27), text1, (0, 0, 255), font=font)  # 添加识别文本
    res = np.asarray(data)  # 返回叠加识别结果的图片
    return res

3.2 图片识别

def license_recognition_image(path):
    image = cv2.imread(path)  # 读取图片
    results = catcher(image)  # 执行识别算法
    for code, confidence, type_idx, box in results:
        # [['京Q58A77', 0.9731929, 0, [150, 160, 451, 259]]]
        text = f"{code} - {confidence:.2f}"
        image = draw_plate_on_image(image, box, text, font=font_ch)  # 绘制识别结果
    cv2.imshow("License Plate Recognition(Directed By RSran)", image)  # 显示检测结果
    cv2.waitKey(0)

3.3 视频识别

def license_recognition_video(path):
    video = cv2.VideoCapture()
    video.open(path)
    i = 0
    while True:
        i += 1
        ref, image = video.read()  # 组帧打开视频
        if ref:
            if i % 10 == 0:
                results = catcher(image)  # 执行识别算法
                for code, confidence, type_idx, box in results:
                    # [['京Q58A77', 0.9731929, 0, [150, 160, 451, 259]]]
                    text = f"{code} - {confidence:.2f}"
                    image = draw_plate_on_image(image, box, text, font=font_ch)  # 绘制识别结果
                cv2.imshow("License Plate Recognition(Directed By RSran)", image)  # 显示检测结果
                if cv2.waitKey(10) & 0xFF == ord('q'):
                    break  # 退出
        else:
            break

3.4 效果展示

下图为百度图片库中检索的案例,如有侵权请联系作者删除。

4、完整代码

# -*- coding: utf-8 -*-
"""
@Time : 2024/4/19 13:59
@Auth : RS迷途小书童
@File :License Plate Recognition.py
@IDE :PyCharm
@Purpose:车辆拍照识别
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
# 导入cv相关库
import cv2
import random
import warnings
import numpy as np
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
import hyperlpr3 as lpr3


def draw_plate_on_image(img, box1, text1, font):
    x1, y1, x2, y2 = box1  # 识别框的四至范围
    # random_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2, cv2.LINE_AA)  # 车牌外框
    # cv2.rectangle(img, (x1, y1 - 25), (x2, y1-3), (139, 139, 102), -1)  # 识别文本底色
    data = Image.fromarray(img)  # 读取图片
    draw = ImageDraw.Draw(data)  # PIL绘制图片
    draw.text((x1, y1 - 27), text1, (0, 0, 255), font=font)  # 添加识别文本
    res = np.asarray(data)  # 返回叠加识别结果的图片
    return res


def license_recognition_video(path):
    video = cv2.VideoCapture()
    video.open(path)
    i = 0
    while True:
        i += 1
        ref, image = video.read()  # 组帧打开视频
        if ref:
            if i % 10 == 0:
                results = catcher(image)  # 执行识别算法
                for code, confidence, type_idx, box in results:
                    # [['京Q58A77', 0.9731929, 0, [150, 160, 451, 259]]]
                    text = f"{code} - {confidence:.2f}"
                    image = draw_plate_on_image(image, box, text, font=font_ch)  # 绘制识别结果
                cv2.imshow("License Plate Recognition(Directed By RSran)", image)  # 显示检测结果
                if cv2.waitKey(10) & 0xFF == ord('q'):
                    break  # 退出
        else:
            break


def license_recognition_image(path):
    image = cv2.imread(path)  # 读取图片
    results = catcher(image)  # 执行识别算法
    for code, confidence, type_idx, box in results:
        # [['京Q58A77', 0.9731929, 0, [150, 160, 451, 259]]]
        text = f"{code} - {confidence:.2f}"
        image = draw_plate_on_image(image, box, text, font=font_ch)  # 绘制识别结果
    cv2.imshow("License Plate Recognition(Directed By RSran)", image)  # 显示检测结果
    cv2.waitKey(0)


if __name__ == "__main__":
    warnings.filterwarnings("ignore", message="Mean of empty slice")  # 忽略“Mean of empty slice”的警告
    warnings.filterwarnings("ignore", message="invalid value encountered in scalar divide")
    # 忽略“invalid value encountered in scalar divide”的警告
    font_ch = ImageFont.truetype("resource/font/platech.ttf", 20, 0)  # 中文字体加载
    catcher = lpr3.LicensePlateCatcher(detect_level=lpr3.DETECT_LEVEL_HIGH)  # 实例化识别对象
    file = r"Y:\2024-04-19 14-49-09.mp4"
    license_recognition_video(file)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

商务谈判模拟口才训练方案(3篇)

商务谈判模拟口才训练方案(3篇) 商务谈判模拟口才训练方案(一) 一、训练目标 本训练方案旨在提高参与者在商务谈判中的口才表达能力,包括清晰表达、有效倾听、应对挑战和构建信任等能力。 二、训练内容 基础口才训练…

android天气实战

页面绘制 问题1、下拉框需要背景为透明 我懒得写全部省份就写了5个所以不需要往下 图标准备 iconfont-阿里巴巴矢量图标库几坤年没来这了好怀念啊,图标库选择下雨的图标等 准备网络请求 0、API接口准备 api免费七日天气接口API 未来一周天气预报api (tianqiap…

智慧能源数据监控平台

随着科技的飞速发展,能源管理已逐渐从传统的粗放型向精细化、智能化转变。在这个转型过程中,HiWoo Cloud平台的智慧能源数据监控平台以其独特的技术优势和创新理念,正引领着能源管理的新潮流。 一、智慧能源数据监控平台的概念 智慧能源数据…

Vue 工程化开发入门

Vue开发的两种方式: 核心包传统开发模式:基于html/css/js文件,直接引入核心包,开发Vue工程化开发模式:基于构建工具的环境中开发Vue 这里选择Vue cli脚手架 进行开发,搜索教程自行下载。 组件化开发 一个页…

【R语言】描述性数据分析与数据可视化

我们处理的变量可以分为两类,一类是连续型变量,另一类叫做分类型变量,其中对于连续型变量,如果服从正态分布就用平均值填充NA,不服从正态分布就用中位数填充NA,对于分类型变量,不管是有序的&…

蓝桥杯单片机省赛——第八届“基于单片机的电子钟程序设计与调试”程序部分

往期回顾 第三届蓝桥杯单片机省赛 第四届蓝桥杯单片机省赛 第五届蓝桥杯单片机省赛 第六届蓝桥杯单片机省赛 第七届蓝桥杯单片机省赛 文章目录 往期回顾一、前期准备二、代码详情1.基础代码蜂鸣器/继电器/led/定时器之类的代码 2.按键详解按键写法讲解 3.驱动的处理驱动写法讲…

Linux学习笔记:进程间的通信.共享内存shm

共享内存shm 什么是共享内存shm共享内存的特点关键函数ftokshmgetshmatshmdtshmctl 代码示例 什么是共享内存shm 进程间通信的前提:必须让不同的进程看到同一份资源,并且这个资源是OS提供的 而共享内存(Share memory)就是在内核共享内存区找一块物理内存空间,并允许多个进程共…

远距离、高品质、低延迟、高保真——SA316无线音频模块带您探索新的音频体验

SA316系列产品分为发射端模块SA316S-TX,SA316F30和接收端模块SA316-RX,该系列方案采用了无线高品质的语音传输芯片来设计,它可以支持外部 PCM / IIS 双模数字音频接口,同时模块为客户提供了标准化的串行接口,使用者可通过串口指令…

使用QT完成如图的游戏登录界面 使用信号和槽完成密文明文密码转换,重置账号和密码,登录校验 详细代码在主页下载

头文件: #ifndef LOGINWIDGET_H #define LOGINWIDGET_H #include <QLineEdit> #include <QPushButton> #include <QWidget> class LoginWidget : public QWidget {Q_OBJECT public: LoginWidget(QWidget *parent = 0); ~LoginWidget(); public slots: …

全新神经网络架构KAN一夜爆火!200参数顶30万,MIT华人一作 | 最新快讯

白交衡宇发自凹非寺 量子位公众号 QbitAI 一种全新的神经网络架构 KAN&#xff0c;诞生了&#xff01; 与传统的 MLP 架构截然不同&#xff0c;且能用更少的参数在数学、物理问题上取得更高精度。 比如&#xff0c;200 个参数的 KANs&#xff0c;就能复现 DeepMind 用 30 万参数…

SpringCloud整合Gateway结合Nacos

目录 一、引入依赖 二、开启两个测试项目 2.1 order service ​编辑 2.2 user service 三、gateway项目 3.1 新建一个bootstrap.yml文件 3.2 将我们的的网关配置写道nacos里的配置里 3.3 测试&#xff1a;看能够根据网关路由到两个测试的项目 四、 优化 4.1 将项目打包…

低空经济+飞行汽车:eVTOL技术详解

低空经济是以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引&#xff0c;辐射带动相关领域融合发展的综合性经济形态。它广泛体现于第一、第二、第三产业之中&#xff0c;在促进经济发展、加强社会保障、服务国防事业等方面发挥着日益重要的作用。 飞行汽车&#xff0c…

## CSDN创作活动:缓解工作压力:程序员的健康之道

缓解工作压力&#xff1a;程序员的健康之道 在当今快节奏的社会中&#xff0c;程序员作为一个高度专业化和技术密集的群体&#xff0c;往往需要面对持续的工作压力和创新挑战。在如此高强度的工作环境下&#xff0c;如何有效缓解工作压力&#xff0c;保持工作效率和个人健康成…

7个AI工具助力产品管理提升

大家好&#xff0c;人工智能AI技术不断进步&#xff0c;AI在产品管理领域的应用也日益广泛。AI以辅助者的角色助力提升产品优化流程的效率&#xff0c;同时激发创新&#xff0c;是不可或缺的强大伙伴。本文将介绍七个AI工具&#xff0c;旨在自动化产品管理者的日常工作流程&…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术&#xff0c;可以给玩家身临其境的感觉&#xff0c;接下来让我们学习这部分的内容吧&#xff01; SteamVR Input SteamVR绑定流程&#xff0c;在Windows窗口的点击SteamVR-input&#xff0c;图1&#xff0c;在这里可以选择你需要绑定…

探秘Redis分布式锁:实战与注意事项

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好!我是小米,一个热爱分享技术的29岁技术达人。今天,我们来聊聊一个很有意思的主题——Redis分区容错之分布式锁。在分布式系统中,锁是一个非常重要的概念,它能确保系统中资源的并发访问不会出现问题。Redis…

如何使用Go语言进行基准测试(benchmark)?

文章目录 一、基准测试的基本概念二、编写基准测试函数三、运行基准测试四、优化代码性能五、注意事项总结 在Go语言中&#xff0c;基准测试&#xff08;benchmark&#xff09;是一种评估代码性能的有效方式。通过基准测试&#xff0c;我们可以测量代码执行的时间、内存使用情况…

【CANoe示例分析】TCP Chat(CAPL) with TLS encription

1、工程路径 C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 15.3.89\Ethernet\Simulation\TLSSimChat 在CANoe软件上也可以打开此工程:File|Help|Sample Configurations|Ethernet - Simulation of Ethernet ECUs|Basic AUTOSAR Adaptive(SOA) 2、示例目…

快速掌握Element-Ul,构建高效网页应用【AI写作】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

并发编程之线程池的设计和原理

一、线程池 提前创建一系列的线程&#xff0c;保存在这个线程池中&#xff0c;有任务要执行的时候&#xff0c;从线程池中取出线程来执行。没有任务的时候&#xff0c;线程池放回去。 二、为什么要使用线程池 线程使用上的问题: 线程的频繁创建 和 销毁 线程的数量过多&…
最新文章