车牌号识别(低级版)

import cv2
from matplotlib import pyplot as plt
import os
import numpy as np
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image, ImageDraw, ImageFont# 利用paddelOCR进行文字扫描,并输出结果
def text_scan(img_path):ocr = PaddleOCR(use_angle_cls=True, use_gpu=False)# img_path = r'test image/license_plate1.jpg'result = ocr.ocr(img_path, cls=True)for line in result:# print(line)return result# 在图片中写入将车牌信息
def infor_write(img, rect, result):text = result[0][0][1][0]cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # cv2和PIL中颜色的hex码的储存顺序不同pilimg = Image.fromarray(cv2img)# PIL图片上打印汉字draw = ImageDraw.Draw(pilimg)  # 图片上打印font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8")  # 参数1:字体文件路径,参数2:字体大小draw.text((rect[2], rect[1]), str(text), (0, 255, 0), font=font)  # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体# PIL图片转cv2 图片cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)return cv2charimgdef plt_show0(img):#cv2与plt的图像通道不同:cv2为[b,g,r];plt为[r,g,b]b,g,r=cv2.split(img)img=cv2.merge([r,g,b])plt.imshow(img)plt.show()
#plt显示灰度图片
def plt_show(img):plt.imshow(img,camp='gray')plt.show()# 图像去噪灰度处理
def gray_guss(img):img = cv2.GaussianBlur(img, (1, 1), 0)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)return gray# 图像尺寸变换
def img_resize(img):a = 400 * img.shape[0] / img.shape[1]a = int(a)img = cv2.resize(img, (400, a))return img# Sobel检测,x方向上的边缘检测(增强边缘信息)
def Sobel_detec(img):Sobel_x = cv2.Sobel(img, cv2.CV_16S, 1, 0)absX = cv2.convertScaleAbs(Sobel_x)return absX# 寻找某区域最大外接矩形框4点坐标
def find_retangle(contour):y, x = [], []for p in contour:y.append(p[0][0])x.append(p[0][1])return [min(y), min(x), max(y), max(x)]# 寻找并定位车牌轮廓位置
def locate_license(img):blocks = []contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:x, y, w, h = cv2.boundingRect(c)r = find_retangle(c)a = (r[2] - r[0]) * (r[3] - r[1])s = (r[2] - r[0]) / (r[3] - r[1])print(w)if (w > (h * 3)) and (w < (h * 5)):blocks.append([r, a, s])# blocks.append([r, a, s])blocks = sorted(blocks, key=lambda b: b[1])[-3:]maxweight, maxindex = 0, -1for i in range(len(blocks)):b = oriimg[blocks[i][0][1]:blocks[i][0][3], blocks[i][0][0]:blocks[i][0][2]]hsv = cv2.cvtColor(b, cv2.COLOR_BGR2HSV)lower = np.array([70, 150, 50])upper = np.array([120, 255, 255])mask = cv2.inRange(hsv, lower, upper)w1 = 0for m in mask:w1 += m / 255w2 = 0for w in w1:w2 += wif w2 > maxweight:maxindex = imaxweight = w2print('blocks是', blocks[maxindex])print('blocks0是',blocks[maxindex][0])return blocks[maxindex][0]# 图像预处理+车牌轮廓位置检测
def fine_lisecenpts(img):# 图像去噪灰度处理guss = gray_guss(img)# Sobel检测,增强边缘信息sobel = Sobel_detec(guss)# 图像阈值化操作——获得二值化图ret, threshold = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU)# # 对二值化图像进行边缘检测(可选,通过边缘检测后,最终进行形态学运算得到的轮廓面积更大)# threshold=cv2.Canny(threshold,threshold.shape[0],threshold.shape[1])# 形态学运算(从图像中提取对表达和描绘区域形状有意义的图像分量)——闭操作kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 10))closing = cv2.morphologyEx(threshold, cv2.MORPH_CLOSE, kernelX, iterations=1)# 腐蚀(erode)和膨胀(dilate)kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 1))kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20))# x方向上进行闭操作(抑制暗细节)img = cv2.dilate(closing, kernelX)img = cv2.erode(img, kernelX)# y方向上进行开操作img = cv2.erode(img, kernelY)img = cv2.dilate(img, kernelY)# 进行中值滤波去噪Blur = cv2.medianBlur(img, 15)# 寻找轮廓rect = locate_license(Blur)print('rect是',rect)return rect, Blur# 车牌字符识别
def seg_char(rect_list, img):img = oriimg[rect_list[1]:rect_list[3], rect_list[0]:rect_list[2]]# 图像去噪灰度处理gray = gray_guss(img)# 图像阈值化操作-获得二值化图(可选)# ret,charimage=cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# 图像进行闭运算k1 = np.ones((1, 1), np.uint8)close = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, k1)cv2.imshow('close', close)cv2.imwrite(r"E:\ultralytics-20240216\21\img2\6.jpg", close)cv2.waitKey()res = text_scan(r"E:\ultralytics-20240216\21\img2\6.jpg")return res
def put_chinese_text(img, text, left_top):# 转换 cv2 img 为 PIL Imageimg_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img_PIL)font = ImageFont.truetype('simhei.ttf', 30, encoding="utf-8")# 黄色文字fillColor = (255,255,0)position = left_topdraw.text(position, text, font=font, fill=fillColor)# 转换回 OpenCV 格式img_out = cv2.cvtColor(np.asarray(img_PIL),cv2.COLOR_RGB2BGR)return img_out# 主函数区
if __name__ == '__main__':img = cv2.imread(r"E:\ultralytics-20240216\21\img2\5.jpg")# 改变图像尺寸img = img_resize(img)oriimg = img.copy()# 寻找到车牌外轮廓矩形坐标print(1)rect, img = fine_lisecenpts(img)# 利用车牌轮廓坐标划分ROI区域用于字符识别,利用OCR识别车牌字符并返回字符串内容result = seg_char(rect, oriimg)print(result)print(rect)# 循环读取车牌字符串并写入到图片中text = result[0][0][1][0]# 获取文本所在的矩形位置left_top = tuple(rect[0:2])right_bottom = tuple(rect[2:4])# 在原始图像上绘制矩形(黄色框)cv2.rectangle(oriimg, left_top, right_bottom, (0, 255, 255), 2)# 在矩形旁边写入文本# 注意你可能需要根据实际情况调整文本的位置text_position = (right_bottom[0] + 1, right_bottom[1])oriimg = put_chinese_text(oriimg, text, text_position)# cv2.putText(oriimg, text, text_position, cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2)cv2.imshow("Image with text", oriimg)cv2.waitKey(0)cv2.destroyAllWindows()

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

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

相关文章

HTML(11)——CSS三大特性

CSS拥有三大特性&#xff0c;分别是&#xff1a;继承性&#xff0c;层叠性&#xff0c;优先级 继承性 说明&#xff1a;子级标签默认继承父级标签的文字控制属性。 如果子级自己有样式&#xff0c;则父级的属性不生效 例如&#xff1a; <style> body{ font-size:30px;…

ADS1220芯片写寄存器失败

1&#xff09;场景&#xff1a;最近调试ADS1220 的芯片&#xff0c;需要读取不同通道的AD值&#xff0c;修改寄存器0的值时一直失败 但是在单片机启动时&#xff0c;写寄存器0时&#xff0c;值能正确写入&#xff0c;并正确读出&#xff0c;之后写完读取出的都是FF或其他异常值…

CobaltStrike后渗透进阶篇

0x01 网络钓鱼攻击 钓鱼攻击简介 钓鱼攻击主要通过生成的木马诱使受害者运行后上线&#xff0c;其中木马一般都伪装成正常的程序。与此同时配合钓鱼网站可帮助攻击者模拟真实网站诱骗受害者访问&#xff0c;达到获取账号密码、上线木马等目的。接下来主要介绍后门程序的生成及…

利用Python爬取天气数据并实现数据可视化,一个完整的Python项目案例讲解

要使用Python爬取天气数据并进行制图分析分几个步骤进行&#xff1a; 选择数据源&#xff1a;首先&#xff0c;你需要找到一个提供天气数据的API或网站。一些常见的选择包括&#xff1a;OpenWeatherMap、Weatherbit、Weather Underground等。 安装必要的库&#xff1a;你需要安…

mamba模型原理解读

本文主要讲解我对于2023年提出的mamba模型的理解和解读&#xff0c;mamba模型的提出为transformer模型存在的计算效率低下&#xff0c;需要大量时间运行程序提出了解决方案。提高了模型的运行效率和计算效率。我主要是根据下面这篇文章入手&#xff1a; 1.mamba模型是通过堆叠多…

SpringBoot调用WebService的实践

作者所在公司的系统间的信息交互是通过webservice完成。如&#xff1a;MES与SAP的交互&#xff0c;MES与WMS的交换&#xff0c;MES与SRM的交互&#xff0c;MES与IOT的交互等。 MES是用.NET VS2008 C#写的&#xff0c;调用webservice很简单&#xff0c;这里不再赘述。如有想了解…

kotlin数组

1、kotlin中的数组与java数组比较&#xff1a; 2、创建 fun main() {// 值创建val a intArrayOf(1,2,3)// 表达式创建val b IntArray(3){println("it: ${it}")it1}println("a数组&#xff1a;${a.contentToString()}, 长度&#xff1a;${a.size}")prin…

重生之 SpringBoot3 入门保姆级学习(22、场景整合 Swagger 接口文档)

重生之 SpringBoot3 入门保姆级学习&#xff08;22、场景整合 Swagger 接口文档&#xff09; 6.2 Swagger 接口文档 6.2 Swagger 接口文档 1、将 starter 导入 Maven 官网 https://springdoc.org/<dependency><groupId>org.springdoc</groupId><artifact…

电路分析期末总结笔记下

对称三相电路的线电流和相电流&#xff0c;线电压和相电压关系 相电压与线电压的关系 线电压定义&#xff1a;任意两相之间的电压称为线电压&#xff0c;常用符号V_L表示。 相电压定义&#xff1a;一相绕组两端的电压称为相电压&#xff0c;常用符号V_P表示。 关系&#xff1…

2024年6月22日(星期六)骑行谷仓坝

2024年6月22日 (星期六) 骑行谷仓坝&#xff0c;早8:00到8:30&#xff0c; 龙泉小学门口(北京路尽头&#xff0c;高架桥下&#xff09;&#xff0c;9:00准时出发 【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:集合 &#xff0c;家住东&#xf…

ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)

前言&#xff1a;在开发过程中&#xff0c;几乎踩便了所有大坑小坑总结出的文章&#xff0c;我是把坑踩满了&#xff0c;帮助更过小白快速上手&#xff0c;如有错误之处&#xff0c;还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能&#xff1a; 模组启动模…

无监督医学图像翻译与对抗扩散模型| 文献速递-深度学习结合医疗影像疾病诊断与病灶分割

Title 题目 Unsupervised Medical Image Translation With Adversarial Diffusion Models 无监督医学图像翻译与对抗扩散模型 01 文献速递介绍 多模态成像对于全面评估人体解剖结构和功能至关重要[1]。通过各自模态捕获的互补组织信息&#xff0c;有助于提高诊断准确性并改…

换位置(C++)

问题描述 体育课上&#xff0c;有一个班级的同学站成了一队&#xff0c;体育老师请最高的和最矮的两位同学调换一下位置&#xff0c;其余的同学不要动&#xff0c;请编程实现&#xff01;&#xff08;假设所有人的高矮都是不一样的&#xff09; 输入 第一行有一个整数 &…

NSSCTF-Web题目10

目录 [强网杯 2019]随便注 1、题目 2、知识点 3、思路 [GXYCTF 2019]BabyUpload 1、题目 2、知识点 3、思路 [强网杯 2019]随便注 1、题目 2、知识点 数据库注入&#xff0c;堆叠注入&#xff0c;更改表名 3、思路 正常提交查询&#xff0c;看看数据回显 加入单引号…

api-ms-win-crt-runtime-l1-1-0.dll文件丢失的情况要怎么处理?比较靠谱的多种修复方法分享

遇到api-ms-win-crt-runtime-l1-1-0.dll文件丢失的情况实际上是一个常见问题&#xff0c;解决此类问题存在多种方法。首先我们先来了解一下api-ms-win-crt-runtime-l1-1-0.dll文件吧&#xff0c;只有了解了我们才知道怎么去解决这个api-ms-win-crt-runtime-l1-1-0.dll文件丢失的…

flutter 打包 exe

采用官方的MSIX打包 原文链接 https://blog.csdn.net/weixin_44786530/article/details/135308360 第一步&#xff1a;安装依赖 在项目根目录&#xff0c;执行命令&#xff1a; flutter pub add --dev msix 等待安装完成&#xff0c;就好了 第二步&#xff1a;打包编译 当m…

LVGL开发教程-img图片

系列文章目录 知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 1. 显示静态图像 2. 显示动态图像gif 3. 文件系统使用 总结 前言 在嵌入式系统中&#xff0c;使用LVGL&#xff08;Light and Versatile Graphics Library&#xff09;显示静态和动态图像是一…

索引与书架、新华字典的爱恨情仇

在MySQL的索引世界中&#xff0c;性能优化一直是开发者们关注的焦点。而索引&#xff0c;作为提升查询速度的关键技术之一&#xff0c;是非常重要的。索引根据存储类型可以分为聚簇索引(聚集)与非聚簇索引(非聚集)&#xff0c;它们决定了数据在磁盘上的存储方式和查询时的访问路…

HANA 自动生成年月维度,指定起始即可生成

官方指导文档&#xff1a;SERIES_GENERATE Function (Series Data) | SAP Help Portal select * from SERIES_GENERATE_DATE(INTERVAL 1 MONTH, 2024-01-01, 2024-12-01) 以下示例生成范围从1999-01-01到1999-01-02的一系列时间戳&#xff0c;该时间戳以30秒的间隔递增&#…

重生之 SpringBoot3 入门保姆级学习(24、场景整合 kafka 消息发送服务)

重生之 SpringBoot3 入门保姆级学习&#xff08;24、场景整合 kafka 消息发送服务&#xff09; 6.4 消息发送服务 6.4 消息发送服务 访问 kafka-ui &#xff08;注意这里需要换成你自己的服务器或者虚拟机的 IP 地址&#xff0c;虚拟机可以用局域网 192.168.xxx.xxx 的地址&…