简单的车牌号识别

目录

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

处理流程与界面

在这里插入图片描述
首先点击“上传图片”按钮,可以选择文件夹中含有汽车车牌的图片,并显示在“图片框”中。
在这里插入图片描述
点击“检测车牌”按钮,会先对“图片框”中即含有汽车车牌的图片使用自训练的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 0ori_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, ImageFontclass 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.mzph.cn/news/819269.shtml

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

相关文章

解析数据科学,探索ChatGPT背后的奥秘

在当今这个由数据驱动和AI蓬勃发展的时代,数据科学作为一门融合多种学科的综合性领域,对于推动各行各业实现数字化转型升级起着至关重要的作用。近年来,大语言模型技术发展态势强劲,为数据科学的进步做出了巨大贡献。其中&#xf…

高效解决Visual Studio Code中文乱码问题

文章目录 问题解决步骤 问题 Visual Studio Code新建一个文件编码方式总是默认GBK,如果我不修改成默认UTF-8,那么每次运行,如果有中文需要输出就会乱码! 解决步骤 之后我会持续更新,如果喜欢我的文章,请记…

OpenCV基本图像处理操作(一)——图像基本操作与形态学操作

环境配置地址 图像显示 import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB imgcv2.imread(cat.jpg) img_gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img_gray.shape cv2.imshow("img_gray", img_gray) cv2…

基于WOA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络(CNN)在时间序列中的应用 4.2 长短时记忆网络(LSTM)处理序列依赖关系 4.3 注意力机制(Attention) 4…

【机器学习300问】69、为什么深层神经网络比浅层要好用?

要回答这个问题,首先得知道神经网络都在计算些什么东西?之前我在迁移学习的文章中稍有提到,跳转链接在下面: 为什么其他任务预训练的模型参数,可以在我这个任务上起作用?http://t.csdnimg.cn/FVAV8 …

Elasticsearch数据写入、检索流程及底层原理全方位解析

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 ✍🏻序言✍🏻1️⃣✍🏻es的架构简介1. 分布式架构2. 索引与搜索3. 数据写入与持久化4. 缓…

C#值类型和引用类型、赋值、区别、相同点

C#值类型和引用类型 **前言:**在C#中变量分为以下几种类型:值类型(Value Types),引用类型(Reference Types),指针类型(Pointer Types);指针类型(变量存储另一种类型变量…

如何做信创测试

信创测试是一种系统化的方法,旨在评估和验证创意和创新项目的潜力和可行性。进行信创测试可以帮助企业在投入大量资源之前,对创意进行客观、科学的评估,以减少失败的风险并最大化成功的可能性。以下是一般性的信创测试步骤: 确定…

用 LLaMA-Factory 在魔搭微调千问

今天在魔搭上把千问调优跑通了,训练模型现在在 Mac 还不支持,需要用 N 卡才可以,只能弄个N 卡的机器,或者买个云服务器。魔搭可以用几十个小时,但是不太稳定,有的时候会自动停止。 注册账号 直接手机号注…

自然语言处理: 第二十七章LLM训练超参数

前言: LLM微调的超参大致有如下内容,在本文中,我们针对这些参数进行解释 training_arguments TrainingArguments(output_dir"./results",per_device_train_batch_size4,per_device_eval_batch_size4,gradient_accumulation_steps2,optim"adamw_8bi…

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

OpenCV基本图像处理操作(五)——图像数据操作

数据读取 cv2.IMREAD_COLOR:彩色图像cv2.IMREAD_GRAYSCALE:灰度图像 import cv2 #opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline imgcv2.imread(cat.jpg)数据显示 #图像的显示,也可以创建多个窗口 c…

力扣练习题(2024/4/15)

1打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋…

数组以及稀疏矩阵的快速转置算法详细分析

一.数组: 1.数组的地址计算: 数组的地址计算比较简单,读者可以自行了解,在这里不再赘述; 2.特殊矩阵的压缩存储: 在这里我们主要说明稀疏矩阵的主要内容: (1)稀疏矩阵…

J垃圾回收

J垃圾回收 1 概述2 方法区的回收3 如何判断对象可以回收3.1 引用计数法3.2 可达性分析法 4 常见的引用对象4.1 软引用4.2 弱引用4.3 虚引用4.4 终结器引用 5 垃圾回收算法5.1 垃圾回收算法的历史和分类5.2 垃圾回收算法的评价标准5.3 标记清除算法5.4 复制算法5.5 标记整理算法…

sky08、09笔记常用组合逻辑电路

本节的目的是为了更好的预估delay。 1.1bit全加器 module fadd_1b( a, b, cin, s, cout ); input wire a,b,cin; output wire s,cout;wire p,g; assign p a|b;//propagate carry assign g a&b;//generate carry assign s a^b^cin; assign cout (p&cin)|g; endmodu…

使用Python脚本检测服务器信息并定时发送至管理员邮箱

在日常的系统管理工作中,监测服务器的资源占用情况至关重要,我们需要及时获得通知以便采取相应措施。我新装了一台UbuntuServer服务器,写了一个可以定期收集服务器的CPU、内存、网络和磁盘信息,并通过邮件将这些信息发送给管理员的…

github上的软件许可证是什么?如何合并本地的分支德语难学还是俄语更加难学?站在一个中国人的立场上,德语难学还是俄语更加难学?俄语跟德语有什么样的显著差别?

目录 github上的软件许可证是什么? 如何合并本地的分支 德语难学还是俄语更加难学? 站在一个中国人的立场上,德语难学还是俄语更加难学? 俄语跟德语有什么样的显著差别? github上的软件许可证是什么? …

经典问题解答(顺序表)

问题一:移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…

信号处理相关知识

1.序列 2.数字信号的自变量一定是整数,幅度上取值是有限的状态(不一定是整数)。 3.抽取和插值