简单的车牌号识别

news2025/2/8 0:44:12

目录

  • 处理流程与界面
  • 各接口编写时遇到的一些问题
    • 上传图片
    • 识别结果标签显示中文

处理流程与界面

在这里插入图片描述
首先点击“上传图片”按钮,可以选择文件夹中含有汽车车牌的图片,并显示在“图片框”中。
在这里插入图片描述
点击“检测车牌”按钮,会先对“图片框”中即含有汽车车牌的图片使用自训练的yolov5目标检测模型进行处理,框选出车牌号部分;然后将框选出的车牌号部分使用paddlehub进行处理,得到车牌号的识别结果;然后将识别结果和识别框添加到含有汽车车牌的图片上,并更新显示在“图片框”中。
在这里插入图片描述
可以看到识别的结果中,中文显示为???,字母和数字正常显示,通过查询资料可知,yolov5 2.0分支的源代码中,detect.py中plot_one_box添加识别结果字符串的具体实现是通过cv2.putText()完成,而putText()不支持非ASCII码的字符。从OpenCV 5.0开始,putText()也支持这些非ASCII码的字符OpenCV 4.x也是可以用putText()绘制中文的,不过需要使用opencv_contrib仓库的freetype模块提供的putText()。freetype模块是对FreeType2的封装,在编译安装OpenCV时需要确保已安装第三方库freetype和harfbuzz,并且打开-DWITH_FREETYPE=ON。查找发现另一种使用稍简单的方法,使用ImageDraw实现,修改代码后界面如下:
在这里插入图片描述

各接口编写时遇到的一些问题

上传图片

点击“上传图片”按钮后,通过信号和槽机制,触发open_image()方法

self.upload_btn.clicked.connect(self.open_image)

open_image()实现如下:

def open_image(self):
        self.lic_label.setText('')
        self.imgName, self.imgType = QFileDialog.getOpenFileName(self.win, "打开图片", "img", "*.jpg;*.tif;*.png;;All Files(*)")
        if self.imgName == "":
            return 0
        ori_img = QPixmap(self.imgName).scaled(self.pics[0].width(), self.pics[0].height(), Qt.KeepAspectRatio)
        self.pics[0].setPixmap(ori_img)

需要注意的是使用QFileDialog.getOpenFileName()打开一个文件,传递的第一个参数的类型需为QWidget类型或其子类,否则控制台会出现如下提示,传入的参数类型不匹配

self.imgName, self.imgType = QFileDialog.getOpenFileName(self, "打开图片", "img", "*.jpg;*.tif;*.png;;All Files(*)")
TypeError: getOpenFileName(parent: Optional[QWidget] = None, caption: Optional[str] = '', directory: Optional[str] = '', filter: Optional[str] = '', initialFilter: Optional[str] = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0): argument 1 has unexpected type 'xxx'

识别结果标签显示中文

使用PIL库中的Image,ImageDraw,ImageFont实现puttext_zn.py

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

class PutTextZn():
    def cv2ImgAddText(self, img, text, left, top, textColor=(0, 255, 0), textSize=20):
        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((left, top), text, textColor, font=fontStyle)

        # 转换回OpenCV格式
        return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

在yolov5 2.0分支的源代码detect.py中,检测结果中的xyxy为一个存有检测结果框的列表

x1, y1, x2, y2 = xyxy

其中x1,y1为检测结果框的左上角点的坐标;x2,y2为检测结果框的右下角点的坐标。x1,y1即分别对应cv2ImgAddText()方法的形参列表中的left,top

put_text_zn = PutTextZn()
lic_reco_img = put_text_zn.cv2ImgAddText(im0, ocr_res, int(x1), int(y1 - 30), (255, 0, 0), 30) #rgb

im0为numpy.ndarray类型,其如何使用QLabel即self.pics[0]显示呢,可以使用以下方法


lic_img = QImage(im0.data, im0.shape[1], im0.shape[0], im0.shape[1]*3, QImage.Format_BGR888)
        lic_pix = QPixmap.fromImage(lic_img)
        self.pics[0].setPixmap(lic_pix)

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

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

相关文章

Spring Task 定时任务(含结合cron 表达式)

目录 一、Spring Task的介绍 二、使用方法 2.1 配置类启用定时任务支持: 2.2 同步定时任务 ​编辑2.3 fixedRate 可以看出不能满足我们的日常需求 那如何让其开启异步呢(开启多个线程工作) 三、Spring Task 结合cron表达式 3.1 corn 表…

FreGS:具有渐进频率正则化的3D高斯溅射

FreGS: 3D Gaussian Splatting with Progressive Frequency Regularization FreGS:具有渐进频率正则化的3D高斯溅射 Jiahui Zhang1  Fangneng Zhan2  Muyu Xu1  Shijian Lu1  Eric Xing3, 4 张家慧 1 詹方能 2 许慕玉 1 卢世坚 1 邢志伟 3, 4 1Nanyang Technolo…

Day23_学点儿IDEA_单元测试@Test在新module项目中失效、Jackson核心对象 ObjectMapper识别不到

版本 IntelliJ IDEA 2023.2.4 目录结构 Study(Project) ├──JavaSE(Module) │ └──xxxx └──JavaWeb(Module)└──xxxx问题 1.1 在JavaSE项目中正常可以用的单元测试Test,到了JavaWeb项目中不起作用了 1.2 解决方法 如果是新创建的项目,先…

【Github】一个用于Active Directory的自助密码更改工具

在众多企业的日常运营中,Active Directory(AD)扮演着核心角色,负责管理和维护员工账户。然而,密码重置作为IT支持团队的常规工作之一,往往既耗时又繁琐。虽然一些商业解决方案和通过Windows服务器上RDS服务…

研究生,该学单片机还是plc。?

PLC门槛相对较低,但是在深入学习和应用时,仍然有很高的技术要求。我这里有一套单片机入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习单片机,不妨点个关注,给个评论222,私信22&am…

【小程序】生成短信中可点击的链接

文章目录 前言一、如何生成链接二、仔细拜读小程序开发文档文档说明1文档说明2 总结 前言 由于线上运营需求,需要给用户发送炮轰短信,用户通过短信点击链接直接跳转进入小程序 一、如何生成链接 先是找了一些三方的,生成的倒是快速&#xf…

vector迭代器失效list迭代器失效

目录 一、vector迭代器失效 1.1插入时的迭代器失效 1.2删除时的迭代器失效 二、list迭代器失效 2.1删除时的迭代器失效 在vector与list的模拟实现中,其中有一问题就是迭代器的失效问题,那么迭代器的失效问题具体是指什么,接下来一探究竟…

【C语言基础】:预处理详解(二)

文章目录 一、宏和函数的对比二、#和##运算符2.1 #运算符2.2 ##运算符 三、#undef四、命令行定义五、条件编译六、头文件的包含1. 头文件包含的方式2. 嵌套文件包含 上期回顾: 【C语言基础】:预处理详解(一) 一、宏和函数的对比 宏通常被应有于执行简单…

系统学c#:1、基础准备(软件下载与安装)

一、Vs软件下载与安装 访问Visual Studio官方网站: https://visualstudio.microsoft.com/zh-hans/downloads 下载Visual Studio 运行exe文件,点击“继续” 初始文件安装完成后选择我们需要安装的项,并勾选好必要的单个组件,设…

VisualStudio2010编译GDAL2.2.4

一、源码目录组织结构 makefile.vc文件是windows下nmake编译工具的makefile文件,nmake.opt是makefile文件的编译选项配置选择文件。 二、打开Visual Studio2010的64位命令行,切换到GDAL224的解压根目录下 输入如下命令回车开始编译源码 nmake -f makef…

Bitwarden 一款开源的密码管理器

Bitwarden Bitwarden 是一款开源的密码管理器,提供强大的安全性和便捷的密码管理功能。 适用于运维、系统较多、密码保密程度较高的场景! 主要功能: 密码保存与自动填充:Bitwarden 可以安全地存储您的用户名和密码&#xff0c…

阿里云迁移到AWS云,九河云保姆级教程

随着云计算技术的不断发展,越来越多的企业开始将传统的IT基础设施迁移到云平台上,以获得更高的灵活性、可扩展性和成本效益。在众多云服务提供商中,阿里云和AWS都是备受青睐的选择。本文将探讨如何将阿里云上的资源顺利迁移到AWS云平台,并针对性地进行优化。我们九河云&#xf…

【第9章】@Autowired

文章目录 前言一、Autowired注入1. 属性注入2. 构造方法注入3. set方法注入4. 形参注入5. byName注入5.1 新增实现类5.2 注入 二、Resource1.引入库2.使用2.1 根据注解的name值注入2.2 根据对象变量名注入2.3 根据对象类型注入 总结 前言 【第8章】全注解开发介绍了全注解开发…

电竞陪玩系统开发平台搭建(小程序,公众号,app)线上线下皆有,线下计算距离。

六大核心功能 1.游戏陪练:可以选择当下火爆的游戏内容,选择游戏大神、职业玩家进行陪练,也可约附近路人玩家或是身边的小伙伴语音组队开黑,一起享受边玩游戏边吐槽的无限乐趣。 2.约玩交友:除了游戏陪玩功能,系统还设置了单独的语…

将自己的项目上传至Git

一、安装Git 官网:Git (git-scm.com) 二、注册gitee 官网:工作台 - Gitee.com 进入“我的”出现以下界面 三、创建仓库 点击加号,新建仓库 根据自己的需求取名,描述仓库,开源还是私有,点击创建即可,点击我的即可…

Linux学习-数据库

数据库软件: 关系型数据库: Mysql Oracle SqlServer Sqlite 非关系型数据库: Redis NoSQL 1.数组、链表、文件、数据库 数组、链表: 内存存放数据的方式(代码运行结束、关机数据丢失) 文件、…

一文掌握 React 开发中的 JavaScript 基础知识

前端开发中JavaScript是基石。在 React 开发中掌握掌握基础的 JavaScript 方法将有助于编写出更加高效、可维护的 React 应用程序。 在 React 开发中使用 ES6 语法可以带来更简洁、可读性更强、功能更丰富,以及更好性能和社区支持等诸多好处。这有助于提高开发效率,并构建出更…

MongoDB 索引全攻略

目录 一、索引介绍 1.1 单字段索引 1.2 复合索引 1.3 多键索引 1.4 主键索引 1.5 TTL 索引 1.6 地理空间索引 1.7 哈希索引 1.8 创建索引时注意事项 1.9 索引效果查看 二、索引实现原理 2.1 为什么使用 B-Tree 三、执行计划 一、索引介绍 任何数据库都有索引这一核心功能&…

Centos7.6部署minikube

1、什么是minikube ? Minikube是由Kubernetes社区维护的单机版的Kubernetes集群,支持macOS, Linux, and Windows等多种操作系统平台,使用最新的官方stable版本,并支持Kubernetes的大部分功能,从基础的容器编排管理,到…

基于AutoCAD的WMTS服务加载方法与应用研究

"针对在AutoCAD中加载地图存在数据定位操作复杂、数据渲染效率低、无法接入第三方地理信息服务的问题,提出了在AutoCAD中加载OGC标准的网络地图分块服务方法。基于ObjectARX二次开发插件,实现在AutoCAD中加载WMTS服务,兼容了第三方地理信…