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

本文主要是介绍【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 = 0while True:i += 1ref, 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 lpr3def 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 resdef license_recognition_video(path):video = cv2.VideoCapture()video.open(path)i = 0while True:i += 1ref, 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:breakdef 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)

这篇关于【Python文字识别】基于HyperLPR3实现车牌检测和识别(Python版本快速部署)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954847

相关文章

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(