基于OpenCV 的车牌识别

article/2025/9/21 10:34:51

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达5913c0aed3c5007e9ae59631cd131904.png

车牌识别是一种图像处理技术,用于识别不同车辆。这项技术被广泛用于各种安全检测中。现在让我一起基于OpenCV编写Python代码来完成这一任务。


车牌识别的相关步骤

1.车牌检测:第一步是从汽车上检测车牌所在位置。我们将使用OpenCV中矩形的轮廓检测来寻找车牌。如果我们知道车牌的确切尺寸,颜色和大致位置,则可以提高准确性。通常,也会将根据摄像机的位置和该特定国家/地区所使用的车牌类型来训练检测算法。但是图像可能并没有汽车的存在,在这种情况下我们将先进行汽车的,然后是车牌。

2.字符分割:检测到车牌后,我们必须将其裁剪并保存为新图像。同样,这可以使用OpenCV来完成。

3. 字符识别:现在,我们在上一步中获得的新图像肯定可以写上一些字符(数字/字母)。因此,我们可以对其执行OCR(光学字符识别)以检测数字。

1.车牌检测

让我们以汽车的样本图像为例,首先检测该汽车上的车牌。然后,我们还将使用相同的图像进行字符分割和字符识别。如果您想直接进入代码而无需解释,则可以向下滚动至此页面的底部,提供完整的代码,或访问以下链接。https://github.com/GeekyPRAVEE/OpenCV-Projects/blob/master/LicensePlateRecoginition.ipynb

在次使用的测试图像如下所示。

c26a5f8fae2193fdae4a20bdd43a4222.png

图片来源链接:https : //rb.gy/lxmiuv

第1步: 将图像调整为所需大小,然后将其灰度。相同的代码如下

img = cv2.resize(img, (620,480) )
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey scale

调整大小后,可以避免使用较大分辨率的图像而出现的以下问题,但是我们要确保在调整大小后,车号牌仍保留在框架中。在处理图像时如果不再需要处理颜色细节,那么灰度变化就必不可少,这加快了其他后续处理的速度。完成此步骤后,图像将像这样被转换

faf8d3a6725ba4e2ca8de6dca802e15d.png

步骤2:每张图片都会包含有用和无用的信息,在这种情况下,对于我们来说,只有牌照是有用的信息,其余的对于我们的程序几乎是无用的。这种无用的信息称为噪声。通常,使用双边滤波(模糊)会从图像中删除不需要的细节。

gray = cv2.bilateralFilter(gray, 13, 15, 15)

语法为 destination_image = cv2.bilateralFilter(source_image, diameter of pixel, sigmaColor, sigmaSpace)。我们也可以将sigma颜色和sigma空间从15增加到更高的值,以模糊掉更多的背景信息,但请注意不要使有用的部分模糊。输出图像如下所示可以看到该图像中的背景细节(树木和建筑物)模糊了。这样,我们可以避免程序处理这些区域。

dbbb380b4255104410b9be487734d1f2.png

步骤3:下一步是我们执行边缘检测的有趣步骤。有很多方法可以做到,最简单和流行的方法是使用OpenCV中的canny edge方法。执行相同操作的行如下所示

edged = cv2.Canny(gray, 30, 200) #Perform Edge detection

语法为destination_image = cv2.Canny(source_image,thresholdValue 1,thresholdValue 2)。阈值谷1和阈值2是最小和最大阈值。仅显示强度梯度大于最小阈值且小于最大阈值的边缘。结果图像如下所示

56eac337d9d5f933546ef7ebbc0a028f.png

步骤4:现在我们可以开始在图像上寻找轮廓

contours=cv2.findContours(edged.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours = imutils.grab_contours(contours)
contours = sorted(contours,key=cv2.contourArea, reverse = True)[:10]
screenCnt = None

一旦检测到计数器,我们就将它们从大到小进行排序,并只考虑前10个结果而忽略其他结果。在我们的图像中,计数器可以是具有闭合表面的任何事物,但是在所有获得的结果中,牌照号码也将存在,因为它也是闭合表面。

为了过滤获得的结果中的车牌图像,我们将遍历所有结果,并检查其具有四个侧面和闭合图形的矩形轮廓。由于车牌肯定是四边形的矩形。

for c in cnts:
# approximate the contourperi = cv2.arcLength(c, True)approx = cv2.approxPolyDP(c, 0.018 * peri, True)
# if our approximated contour has four points, then
# we can assume that we have found our screen
if len(approx) == 4:screenCnt = approx
break

找到正确的计数器后,我们将其保存在名为screenCnt的变量中,然后在其周围绘制一个矩形框,以确保我们已正确检测到车牌。

15742808866402302e38aa051d03f103.png

步骤5:现在我们知道车牌在哪里,剩下的信息对我们来说几乎没有用。因此,我们可以对整个图片进行遮罩,除了车牌所在的地方。相同的代码如下所示

# Masking the part other than the number plate
mask = np.zeros(gray.shape,np.uint8)
new_image = cv2.drawContours(mask,[screenCnt],0,255,-1,)
new_image = cv2.bitwise_and(img,img,mask=mask)

被遮罩的新图像将如下所示

db9ee2f2af55dadb1ec44c65d6190d1f.png

2.字符分割

车牌识别的下一步是通过裁剪车牌并将其保存为新图像,将车牌从图像中分割出来。然后,我们可以使用此图像来检测其中的字符。下面显示了从主图像裁剪出ROI(感兴趣区域)图像的代码

# Now crop
(x, y) = np.where(mask == 255)
(topx, topy) = (np.min(x), np.min(y))
(bottomx, bottomy) = (np.max(x), np.max(y))
Cropped = gray[topx:bottomx+1, topy:bottomy+1]

结果图像如下所示。通常添加到裁剪图像中,如果需要,我们还可以对其进行灰色处理和边缘化。这样做是为了改善下一步的字符识别。但是我发现即使使用原始图像也可以正常工作。

2becfe79ec045df59994947c1415fda5.png

3.字符识别

该车牌识别的最后一步是从分割的图像中实际读取车牌信息。就像前面的教程一样,我们将使用pytesseract包从图像读取字符。相同的代码如下

#Read the number plate
text = pytesseract.image_to_string(Cropped, config='--psm 11')
print("Detected license plate Number is:",text)

6af8d8160190db9d9eb08f78f9add041.png

原始图像上印有数字“ CZ20FSE”,并且我们的程序检测到它在jupyter笔记本上打印了相同的值。

车牌识别失败案例

车牌识别的完整代码,其中包含程序和我们用来检查程序的测试图像。要记住,此方法的结果将不准确。准确度取决于图像的清晰度,方向,曝光等。为了获得更好的结果,您可以尝试同时实现机器学习算法。

33a5911fbbaf0e30d5b3c0e6d0c3ef41.png

这个案例中我们的程序能够正确检测车牌并进行裁剪。但是,Tesseract库无法正确识别字符。OCR已将其识别为“ MH13CD 0036”,而不是实际的“ MH 13 CD 0096”。通过使用更好的方向图像或配置Tesseract引擎,可以纠正此类问题。


其他成功的例子

大多数时候,图像质量和方向都是正确的,程序能够识别车牌并从中读取编号。下面的快照显示了获得的成功结果。

d883981c18c60a60a4eb0c6060de87f9.png

be8ecf00ab435e691cbd572045f8b380.png

完整代码

#@programming_fever
import cv2
import imutils
import numpy as np
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'img = cv2.imread('D://skoda1.jpg',cv2.IMREAD_COLOR)
img = cv2.resize(img, (600,400) )gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
gray = cv2.bilateralFilter(gray, 13, 15, 15)edged = cv2.Canny(gray, 30, 200) 
contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = imutils.grab_contours(contours)
contours = sorted(contours, key = cv2.contourArea, reverse = True)[:10]
screenCnt = Nonefor c in contours:peri = cv2.arcLength(c, True)approx = cv2.approxPolyDP(c, 0.018 * peri, True)if len(approx) == 4:screenCnt = approx
breakif screenCnt is None:detected = 0
print ("No contour detected")
else:detected = 1if detected == 1:cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)mask = np.zeros(gray.shape,np.uint8)
new_image = cv2.drawContours(mask,[screenCnt],0,255,-1,)
new_image = cv2.bitwise_and(img,img,mask=mask)(x, y) = np.where(mask == 255)
(topx, topy) = (np.min(x), np.min(y))
(bottomx, bottomy) = (np.max(x), np.max(y))
Cropped = gray[topx:bottomx+1, topy:bottomy+1]text = pytesseract.image_to_string(Cropped, config='--psm 11')
print("programming_fever's License Plate Recognition\n")
print("Detected license plate Number is:",text)
img = cv2.resize(img,(500,300))
Cropped = cv2.resize(Cropped,(400,200))
cv2.imshow('car',img)
cv2.imshow('Cropped',Cropped)cv2.waitKey(0)
cv2.destroyAllWindows()

Github链接-https: //github.com/GeekyPRAVEE/OpenCV-Projects/blob/master/LicensePlateRecoginition.ipynb 

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

1a807fffa801d2cff43f5a3cd7a056cd.png

9f1c61fe720621d5c5125b6fa9713cbe.png


http://chatgpt.dhexx.cn/article/qcEs5fAm.shtml

相关文章

车牌号识别 python + opencv

 包括算法和客户端界面,只有2个文件,surface.py是界面代码,predict.py是算法代码,界面不是重点所以用tkinter写得很简单。 使用方法: 版本:python3.4.4,opencv3.4和nu…

车牌识别 字符识别

字符结构知识在车牌识别中的应用 来源:电子技术应用 作者:中国科学技术大学 宋建才 摘要:提出了一种完全基于结构知识的字符识别方法。该方法以字符的结构特点和笔画类型、数据及位置作为识别特片生成判定时,再利用判定树对汽车牌…

【深度学习实践】基于深度学习的车牌识别(python,车牌检测+车牌识别)

车牌识别具有广泛的应用前景,基于传统方法的车牌识别效果一般比较差,随着计算机视觉技术的快速发展,深度学习的方法能够更好的完成车牌识别任务。 本文提供了车牌识别方案的部署链接,您可以在网页上体验该模型的效果:车…

C++中文车牌识别检测系统源码

下载地址:C中文车牌识别检测系统源码 其目标是成为一个简单、高效、准确的非限制场景(unconstrained situation)下的车牌识别库。 相比于其他的车牌识别系统,EasyPR有如下特点: 它基于openCV这个开源库。这意味着你可以获取全部源代码&…

车辆检测+车牌识别

车辆检测算法使用YOLOv5实现 自建数据集训练的车辆检测模型,效果还是很棒的 车牌识别使用mtcnn实现车牌检测 lprnet实现车牌号码识别 两者都是pytorch框架 整合在一个工程中实现车辆检测和车牌识别 同时使用pyqt开发可视化界面

智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》

智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》 目录 智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》 1. 前言 2.车牌号码说明 3.车牌数据集CCPD (1)车牌数据集CCPD说明 (2&#xff09…

智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》

智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》 目录 智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》 1. 前…

在线合成车牌照片【模拟车牌,用于车牌识别项目测试】

1、服务发布地址: http://new.hdsxsc.com:10086/server.php?cphm冀DSX888&cpys0 2、传参说明: cphm:车牌号码【仅限合规的车牌号码规则】 cpys:车牌颜色: 0蓝色,1黄色,2白色&#xff0c…

车牌号码识别程序分享

本文参考博客使用opencv进行车牌提取及识别进行。程序部分为网上获取程序修改而来,并在其中加入了自己的注释和理解 采用pythonopencv进行程序编写。 课程设计内容分享 程序下载请前往https://download.csdn.net/download/chenkz123/10841956 一个典型的车辆牌照…

车牌图像识别

1.车牌预处理 车牌预处理过程的好坏直接影响到车牌图像进行后期处理过程,比如车牌字符分割等。车牌预处理也是尽可能的消除噪声,减少后期处理带来的不必要的麻烦。 输入的车牌是24Bit的BMP真彩色图像,车牌照有黄底黑字,蓝底白字…

基于python+OpenCV的车牌号码识别

基于pythonOpenCV的车牌号码识别 车牌识别行业已具备一定的市场规模,在电子警察、公路卡口、停车场、商业管理、汽修服务等领域已取得了部分应用。一个典型的车辆牌照识别系统一般包括以下4个部分:车辆图像获取、车牌定位、车牌字符分割和车牌字符识别 …

TensorFlow进阶:车牌号识别项目

终于算是闲下来点时间了,也不能算闲,该交的报告什么的算完事了。其他要交的东西现在还不急,然后考研的东西现在也不想看,再加上中午没睡好,下午也不想学习新的东西了,就抽出点时间把前段时间做的一个小项目…

数字图像处理--车牌识别

数字图像处理–车牌识别 主要内容 实现车牌识别 算法流程 本文中,车牌识别具体流程设计以及算法使用主要分为以下几步。 1、读取源车牌图像。 2、对原始车牌图像进行预处理:灰度化,运用基于几何运算的滤波器(开运算)消除毛刺噪声。 3、二…

数字图像处理——基于matlab的车牌号识别

希望大家有问题多多评论留言鸭 码字不易&#xff0c;老阿姨头发都没啦&#xff0c;小可爱们记得给三连鸭&#xff0c;么么哒。 &#xff08;只收藏&#xff0c;不点赞&#xff0c;好运连连会中断&#xff01;&#xff01;&#xff01;&#xff09; <--!&#xff08;源码资源…

【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)

前面4篇博客介绍了OpenCV图像处理的基础知识&#xff0c;本篇博客利用前4篇的知识完成一个小项目——车牌号码识别。该篇博客的代码可以满足小区门禁车牌号的识别。本篇博客是前4篇博客知识的一个综合运用。感觉学会了这个可以实现一系列的图像识别任务。。。毕竟好多技巧都是共…

网络安全检测技术

一&#xff0c;网络安全漏洞 安全威胁是指所有能够对计算机网络信息系统的网络服务和网络信息的机密性&#xff0c;可用性和完整性产生阻碍&#xff0c;破坏或中断的各种因素。安全威胁可分为人为安全威胁和非人为安全威胁两大类。 1&#xff0c;网络安全漏洞威胁 漏洞分析的…

深度学习网络安全

Introduction 我们在社区中看到的大多数深度学习应用程序通常面向营销&#xff0c;销售&#xff0c;财务等领域。我们几乎从未阅读过文章或找到有关深度学习的资源用于保护这些产品和业务&#xff0c; 恶意软件和黑客攻击。 虽然像谷歌&#xff0c;Facebook&#xff0c;微软和…

网络安全法学习整理笔记

网络安全法 一、背景 概念 网络&#xff1a;是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息进行收集、存储、传输、交换、处理的系统。网络安全&#xff1a;是指通过采取必要措施&#xff0c;防范对网络的攻击、侵入、干扰、破坏和非法使用以及意…

网络安全免费学习网址(英文)

转载 作者&#xff1a;W-Pwn 链接&#xff1a;https://www.zhihu.com/question/49222590/answer/339206050 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 知识就是力量 但是知识太贵了&#xff0c;现在随便拎…

【论文阅读】基于强化学习的网络安全防护策略

【论文阅读】基于强化学习的网络安全防护策略 本篇文章将介绍一篇针对网络安全问题&#xff0c;运用强化学习方法寻找最优的网络防御策略。 Finding Effective Security Strategies through Reinforcement Learning and Self-Play 前言 通过强化学习和 自对弈(self-play) 寻…