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

news2024/11/23 4:28:54

        闲来无事,想复现一下网上的基于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.coloradmin.cn/o/1640286.html

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

相关文章

Qt 信号槽中信号重名解决办法

1、类似与Qt4中的写法&#xff1a; 2、函数指针 3、泛型 connect(ui->combox, QOverload<int>::of(&QCombox::currentIndexChanged), this ,&mainwindow::onindexchange);

【数学 排列组合】1643. 第 K 条最小指令

本文涉及知识点 数学 排列组合 LeetCode1643. 第 K 条最小指令 Bob 站在单元格 (0, 0) &#xff0c;想要前往目的地 destination &#xff1a;(row, column) 。他只能向 右 或向 下 走。你可以为 Bob 提供导航 指令 来帮助他到达目的地 destination 。 指令 用字符串表示&am…

每日一题-贪心算法

目录 前言 买入股票的最佳时机(1) 买入股票的最好时机(2) 前言 当你踏上贪心算法的旅程&#xff0c;仿佛置身于一场智慧的盛宴&#xff0c;每一步都是对问题解决方案的审慎选择&#xff0c;每一次决策都是对最优解的向往。贪心算法以其简洁高效的特性&#xff0c;被广泛运用于…

SSM+Vue在线OA办公系统

在线办公分三个用户登录&#xff0c;管理员&#xff0c;经理&#xff0c;员工。 SSM架构&#xff0c;maven管理工具&#xff0c;数据库Mysql&#xff0c;系统有文档&#xff0c;可有偿安装调试及讲解&#xff0c;项目保证质量。需要划到 最底 下可以联系到我。 功能如下&am…

Java 获取 Outlook 邮箱的日历事件

Java 获取 Outlook 邮箱的日历事件 1.需求描述2.实现方案3.运行结果 IDE&#xff1a;IntelliJ IDEA 2022.3.3 JDK&#xff1a;1.8.0_351 Outlook&#xff1a;Microsoft Office 2016 1.需求描述 比如现在需要获取 Outlook 邮箱中四月的全部的会议安排&#xff0c;如下图所示 …

指标完成情况对比查询sql

指标完成情况对比查询sql 1. 需求 2. SQL select--部门dept.name as bm,--年度指标任务-新签&#xff08;万元&#xff09;ndzbwh.nxqndzbrw as nxqndzbrw,--年度指标任务-收入&#xff08;万元&#xff09;ndzbwh.nsrndzbrw as nsrndzbrw,--年度指标任务-回款&#xff08;万…

软件工程毕业设计选题100例

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准&#xff1a; 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…

dnf游戏攻略:保姆级游戏攻略!

欢迎来到DNF&#xff0c;一个扣人心弦的2D横版格斗游戏世界&#xff01;无论你是新手还是老玩家&#xff0c;这篇攻略都将为你提供宝贵的游戏技巧和策略&#xff0c;助你在游戏中大展身手&#xff0c;成为一名强大的冒险者。 一、角色选择 在DNF中&#xff0c;角色的选择至关重…

Python的使用

1、打印&#xff1a;print&#xff08;‘hello’&#xff09; 2、Python的除法是数学意义上的除法 print&#xff08;2/3&#xff09; 输出&#xff1a;0.6666... 3、a18 a‘hello’ print(a) 可以直接输出 4、**2 表示2的平方 5、打印类型 print&#xff08;type&am…

安卓四大组件之Activity

目录 一、简介二、生命周期三、启动模式3.1 Standard3.2 Single Task3.3 SingleTop3.4 Single Instance3.5 启动模式的配置 四、Activity 的跳转和数据传递4.1 Activity 的跳转4.1.1 直接跳转4.1.2 回调 4.2 Activity 的数据传递4.2.1 传递普通数据4.2.2 传递一组数据4.2.3 传递…

【LinuxC语言】系统日志

文章目录 前言一、系统日志的介绍二、向系统日志写入日志信息三、示例代码总结 前言 在Linux系统中&#xff0c;系统日志对于监控和排查系统问题至关重要。它记录了系统的运行状态、各种事件和错误信息&#xff0c;帮助系统管理员和开发人员追踪问题、进行故障排除以及优化系统…

分割链表----一道题目的3种不同的解法

1.题目概述 以这个题目的事例作为例子&#xff0c;我们看一下这个题目到底是什么意思&#xff08;Leedcode好多小伙伴说看不懂题目是什么意思&#xff09;&#xff0c;就是比如一个x3&#xff0c;经过我们的程序执行之后&#xff1b;大于3的在这个链表的后面&#xff0c;小于3的…

Linux使用操作(二)

进程的管理_ps 程序运行在计算机操作系统中&#xff0c;由操作系统进行管理。为了管理正在运行的程序&#xff0c;每个程序在运行时都被注册到操作系统中&#xff0c;形成进程 每个进程都有一个独特的进程ID&#xff08;进程号&#xff09;&#xff0c;用来区别不同的进程。进…

C++初阶-----对运算符重载的进一步理解(2)

目录 1.对于加加&#xff0c;减减运算符的重载理解 2.const修饰的一些事情 3.日期对象之间的减法实现逻辑 1.对于加加&#xff0c;减减运算符的重载理解 &#xff08;1&#xff09;在C语言里面&#xff0c;我们已经知道并且了解加加&#xff0c;减减的一些基本的用法&#…

STM32H7 HSE时钟的使用方法介绍

目录 概述 1 STM32H750 HSE时钟介绍 2 使用STM32Cube创建Project 3 认识HSE时钟 3.1 HSE时钟的特性 3.2 HSE的典型应用电路 4 STM32Cube中配置时钟 4.1 时钟需求 4.2 配置参数 4.2.1 使能外围资源 4.2.2 使用STM32Cube注意项 4.2.3 配置参数 5 总结 概述 本文主要…

超强鉴别 cdn 小工具

最近做一个攻防演习&#xff0c;使用了一些工具收集域名&#xff0c;子域名&#xff0c;但是在将这些域名解析成 IP 这个过程遇到了一些小问题&#xff0c;默认工具给出的 cdn 标志根本不准&#xff0c;所以被迫写了这么一个小工具&#xff1a;get_real_ip.py PS&#xff1a;下…

ThreeJS:项目搭建

介绍如何基于Vite、Vue、React构建ThreeJS项目。 Vite项目 1. 初始化项目&#xff0c;命令&#xff1a;npm init vitelatest&#xff0c; 2. 安装依赖&#xff0c;命令&#xff1a;npm install&#xff0c; 3. 启动项目&#xff0c;命令&#xff1a;npm run dev。 4. 样式初始…

神经网络中的优化方法

一、引入 在传统的梯度下降优化算法中&#xff0c;如果碰到平缓区域&#xff0c;梯度值较小&#xff0c;参数优化变慢 &#xff0c;遇到鞍点&#xff08;是指在某些方向上梯度为零而在其他方向上梯度非零的点。&#xff09;&#xff0c;梯度为 0&#xff0c;参数无法优化&…

基于Springboot的滑雪场管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的滑雪场管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…