车牌号识别(低级版)

2024-06-13 17:04
文章标签 识别 车牌号 低级

本文主要是介绍车牌号识别(低级版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/1057898

相关文章

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

Clion不识别C代码或者无法跳转C语言项目怎么办?

如果是中文会显示: 此时只需要右击项目,或者你的源代码目录,将这个项目或者源码目录标记为项目源和头文件即可。 英文如下:

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN:在生物医学自然语言处理中,NER和NEN是关键任务,它们使得从生物医学文献中自动提取实体(如疾病和药物)成为可能。 BERN2:BERN2是一个工具,

行为智能识别摄像机

行为智能识别摄像机 是一种结合了人工智能技术和监控摄像技术的先进设备,它能够通过深度学习算法对监控画面进行实时分析,自动识别和分析监控画面中的各种行为动作。这种摄像机在安防领域有着广泛的应用,可以帮助监控人员及时发现异常行为,并采取相应的措施。 行为智能识别摄像机可以有效预防盗窃事件。在商场、超市等公共场所安装这种摄像机,可以通过识别异常行为等情况,及时报警并阻止不安全行为的发生