轻松使用 Python 检测和识别车牌(附代码)

news2025/6/8 9:21:32

车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。

本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理,检测和识别车牌,最后显示车牌字符,作为输出内容。

文章目录

  • 技术提升
  • 创建Python环境
  • 如何在您的计算机上
    • 导入库
    • 获取输入
    • 预处理输入
    • 在输入端检测车牌
    • 识别检测到的车牌
    • 显示输出
  • 磨砺您的Python技能

技术提升

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

好的文章离不开粉丝的分享、推荐,资料干货、资料分享、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:pythoner666,备注:来自CSDN
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

创建Python环境

要轻松地完成本教程,您需要熟悉Python基础知识。应先创建程序环境。

在开始编程之前,您需要在环境中安装几个库。打开任何Python IDE,创建一个Python文件。在终端上运行命令以安装相应的库。您应该在计算机上预先安装Python PIP。

  • OpenCV-Python: 您将使用这个库对输入图像进行预处理,并显示各个输出图像。

pip install OpenCV-Python

  • imutils: 您将使用这个库将原始输入图像裁剪成所需的宽度。
pip install imutils
  • pytesseract: 您将使用这个库提取车牌字符,并将它们转换成字符串。
pip install pytesseract

pytesseract 库依赖 Tesseract OCR 引擎进行字符识别。

如何在您的计算机上

安装Tesseract OCR?

Tesseract OCR是一种可以识别语言字符的引擎。在使用pytesseract库之前,您应该在计算机上安装它。步骤如下:

1. 打开任何基于Chrome的浏览器。

2. 下载Tesseract OCR安装程序。

3. 运行安装程序,像安装其他程序一样安装它。

准备好环境并安装tesseract OCR后,您就可以编写程序了。

导入库

首先导入在环境中安装的库。导入库让您可以在项目中调用和使用它们的函数。

  • importcv2

  • importimutils

  • importpytesseract

您需要以cv2形式导入OpenCV-Python库。使用与安装时相同的名称导入其他库。

获取输入

然后将pytesseract指向安装Tesseract引擎的位置。使用cv2.imread函数将汽车图像作为输入。将图像名称换成您在使用的那个图像的名称。将图像存储在项目所在的同一个文件夹中,以方便操作。

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'  
original_image = cv2.imread('image3.jpeg')  

左右滑动查看完整代码

您可以将下面的输入图像换成想要使用的图像。

预处理输入

将图像宽度调整为500像素,然后将图像转换成灰度图像,因为canny边缘检测函数只适用于灰度图像。最后,调用bilateralFilter函数以降低图像噪声。

original_image = imutils.resize(original_image, width=500 )  
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)  
gray_image = cv2.bilateralFilter(gray_image, 11, 17, 17)

在输入端检测车牌

检测车牌是确定汽车上有车牌字符的那部分的过程。

(1)执行边缘检测

先调用cv2.Canny函数,该函数可自动检测预处理图像上的边缘。

edged_image = cv2.Canny(gray_image, 30,200)

我们将通过这些边缘找到轮廓。

(2)寻找轮廓

调用cv2.findContours函数,并传递边缘图像的副本。这个函数将检测轮廓。使用cv2.drawContours函数,绘制原始图像上已检测的轮廓。最后,输出所有可见轮廓已绘制的原始图像。

contours, new = cv2.findContours(edged_image.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)  
img1 = original_image.copy()  
cv2.drawContours(img1, contours, -1, (0, 255, 0), 3)  
cv2.imshow("img1", img1)  

左右滑动查看完整代码

该程序绘制它在汽车图像上找到的所有轮廓。

找到轮廓后,您需要对它们进行筛选,以确定最佳候选轮廓。

(3)筛选轮廓

根据最小面积30对轮廓进行筛选。忽略小于这个面积的轮廓,因为它们不太可能是车牌轮廓。复制原始图像,在图像上绘制前30个轮廓。最后,显示图像。

contours = sorted(contours, key = cv2.contourArea, reverse = True)[:30]  
# stores the license plate contour  
screenCnt = None  
img2 = original_image.copy()  
  
# draws top 30 contours  
cv2.drawContours(img2, contours, -1, (0, 255, 0), 3)  
cv2.imshow("img2", img2)

左右滑动查看完整代码

现在轮廓数量比开始时要少。唯一绘制的轮廓是那些近似含有车牌的轮廓。

最后,您需要遍历已筛选的轮廓,确定哪一个是车牌。

(4)遍历前30个轮廓

创建遍历轮廓的for循环。寻找有四个角的轮廓,确定其周长和坐标。存储含有车牌的轮廓的图像。最后,在原始图像上绘制车牌轮廓并加以显示。

count = 0  
idx = 7  
  
**for** c **in** contours:  
    # approximate the license plate contour  
    contour_perimeter = cv2.arcLength(c, True)  
    approx = cv2.approxPolyDP(c, 0.018 * contour_perimeter, True)  
  
    # Look for contours with 4 corners  
    **if** len(approx) == 4:  
        screenCnt = approx  
  
        # find the coordinates of the license plate contour  
        x, y, w, h = cv2.boundingRect(c)  
        new_img = original_image [ y: y + h, x: x + w]  
  
        # stores the new image  
        cv2.imwrite('./'+str(idx)+'.png',new_img)  
        idx += 1  
        break  
  
# draws the license plate contour on original image  
cv2.drawContours(original_image , [screenCnt], -1, (0, 255, 0), 3)  
cv2.imshow("detected license plate", original_image )

循环之后,程序已识别出含有车牌的那个轮廓。

识别检测到的车牌

识别车牌意味着读取已裁剪车牌图像上的字符。加载之前存储的车牌图像并显示它。然后,调用pytesseract.image_to_string函数,传递已裁剪的车牌图像。这个函数将图像中的字符转换成字符串。

# filename of the cropped license plate image  
cropped_License_Plate = './7.png'  
cv2.imshow("cropped license plate", cv2.imread(cropped_License_Plate))  
  
# converts the license plate characters to string  
text = pytesseract.image_to_string(cropped_License_Plate, lang='eng')

左右滑动查看完整代码

已裁剪的车牌如下所示。上面的字符将是您稍后在屏幕上输出的内容。

检测并识别车牌之后,您就可以显示输出了。

显示输出

这是最后一步。您将提取的文本输出到屏幕上。该文本含有车牌字符。

print("License plate is:", text)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

程序的预期输出应该如下图所示:

车牌文本可以在终端上看到。

磨砺您的Python技能

用Python检测和识别车牌是一个有意思的项目。它有挑战性,所以应该会帮助您学到关于Python的更多知识。

说到编程,实际运用是掌握一门语言的关键。为了锻炼技能,您需要开发有意思的项目。

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

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

相关文章

AWS实战:Dynamodb到Redshift数据同步

AWS Dynamodb简介 Amazon DynamoDB 是一种完全托管式、无服务器的 NoSQL 键值数据库,旨在运行任何规模的高性能应用程序。DynamoDB能在任何规模下实现不到10毫秒级的一致响应,并且它的存储空间无限,可在任何规模提供可靠的性能。DynamoDB 提…

Linux破解root密码

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Linux操作…

Postgresql中不支持事务块中调用plpgsql回滚(多层exception、事务块有检查点)

前言 Postgresql使用子事务来实现EXCEPTION的功能,即在进入EXCEPTION的存储过程前,会自动起一个子事务,如果发生了异常,则自动回滚子事务,达成EXCEPTION的效果。那么如果在事务块内本身就带子事务(SAVEPOI…

Python文件操作-代码案例

文章目录文件打开文件open写文件上下文管理器第三方库简单应用案例使用python生成二维码使用python操作excel程序员鼓励师学生管理系统文件 变量就在内存中,文件在硬盘中. 内存空间更小,访问速度快,成本贵,数据容易丢失,硬盘空间大,访问慢,偏移,持久化存储. \\在才是 \的含义…

十分钟上手把玩树莓派——系统创建指南

无意中发现一个落灰的树莓派 故事便开始了…… 准备工作 树莓派 3B一张大于 8G 的 micro SD 卡一个读卡器HDMI 显示器及连接线、键盘、鼠标等外围设备 系统镜像下载 推荐两个树莓派镜像下载网站 树莓派官方网站:https://www.raspberrypi.com/software/树莓派实…

“赶快回家网”首页制作

“赶快回家网”首页制作一、实验名称:二、实验日期:三、实验目的:四、实验内容:五、实验步骤:六、实验结果:七、源程序:八、心得体会:一、实验名称: “赶快回家网”首页…

使用Jmeter抓取手机APP报文并进行APP接口测试

Jmeter是一个比较常用的接口测试工具,尤其是接口性能测试。当然它也可以用来测试手机APP的HTTP接口,我在Fiddler抓取手机APP报文 和 接口测试代理工具charles mock测试 分别介绍了Fiddler和charles 如何抓取APP报文,本文介绍使用Jmeter来抓取…

第六章 关系数据理论(规范化详解)

第六章 关系数据理论 6.1 问题的提出 本章主要讨论关系数据理论。在讨论数据库的时候,绕不开的一个问题是:针对一个具体问题,应该如何构建一个适合他的数据库模式。这是数据库设计的问题,确切地讲是关系数据库逻辑设计的问题。为…

python最新采集某站美女,还不快学起来,下载可能下架视频

前言 大家早好、午好、晚好吖 ❤ ~ 这个页面大家认识吧~ 喜欢看吧 那我们今天就来采集一下它呀~ 开发环境: 版 本: python 3.8 编辑器: pycharm 2022.3.2 专业版 requests >>> pip install requests ffmpeg 音视频合成软件 如果安装python第三方模块: win R 输…

民用建筑电力系统运行和节能中的应用——电力监控系统篇

【摘要】本文中概述电力监控系统结构和作用,通过列举工程实例,详细介绍了电力监控系统在民用建筑电力系统运行和节能中的应用,以及在推广和发展方面需要改进的问题。 【关键词】民用建筑;电力监控系统;运行和节能中的…

cmd常用的操作命令

使用windows系统,通常在cmd中输入指令,会调用相应的一些程序或者执行一些功能,学会使用CMD中的命令,可以加快我们一些操作,省时省力。 ipconfig ------查询IP地址 gpedit.msc-----组策略 sndrec32-------录音机 Nsloo…

小程序自动化测试框架【Minium】系列(三)元素定位详解

元素定位 元素定位,应该是很多UI自动化测试入门学习必会的技能了,下面我将为大家举例演示元素定位的几种方法。 1、CSS选择器 Minium 可以通过 WXSS 选择器定位元素,如下图所示: 如果有[CSS选择器]基础会上手更快 ,如…

Maven知识点-插件-maven-surefire-plugin简介

Maven本身并不是一个单元测试框架,Java 世界中主流的单元测试框架为JUnit 和TestNG。 Maven 所做的只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。 这一插件就是maven-surefire-plugin,可以称之为测试…

Docker安装ElasticSearch,并进行ik和hanlp分词

我按装的目标: 利用ElastiSearch存储数据,ik和hanlp分词插件 对 搜索词进行分词,在ES存储的库中找到与搜索词相近的内容。 安装感受: 原始环境安装老版本的ES,BUG不断,ES相关解答博客对新手有点不友好,完整的解释不多&…

Elasticsearch7.8.0版本进阶——分布式集群(故障转移)

目录一、Elasticsearch集群的安装1.1、Elasticsearch集群的安装(win10环境)1.2、Elasticsearch集群的安装(linux环境)二、故障转移的概述三、故障转移(win10环境集群演示)一、Elasticsearch集群的安装 1.1…

分布式高级篇1 —— 全文检索

Elasticsearch Elasticsearch简介一、基本概念1、index(索引)2、Type(类型)3、Document(文档)4、倒排索引二、Docker 安装 EL1、拉取镜像2、创建实例三、初步探索1、_cat2、索引一个文档(保存)3、查询文档3、更新文档4、删除文档&索引5、_bulk 批量 AP6、样本测试数据四、进…

安全测试的最常用方法你知道多少呢?

安全性测试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程,其主要目的是查找软件自身程序设计中存在的安全隐患,并检查应用程序对非法侵入的防范能力,安全指标不同,测试策略也不同。 但安全是相对的…

【ESP32+freeRTOS学习笔记-(七)中断管理】

目录1、概述2、在ISR中使用FreeRTOS中专用的API2.1 独立的用于ISR中的API2.2 关于xHigherPriorityTaskWoken 参数的初步理解3、延迟中断处理的方法-将中断中的处理推迟到任务中去4 方法一:用二进制信号量来同步ISR与”延时处理的任务“4.1 二进制信号量4.2 函数用法…

高中生用台灯哪种好?2023最好的台灯品牌排行榜

高中生的学习时长是最长的,所以导致现在许多高中生都戴上了眼镜,主要是因为长时间对着书本,没有合理的让眼睛休息,导致眼疲劳,而选择护眼台灯是最好的,台灯内置的护眼技术是非常实用的,可以改善…

SIP协议的一键对讲终端

SIP对讲终端是一款采用了ARMDSP架构,接收网络音频流,实时解码播放;配置了麦克风输入和扬声器输出,作为网络数字广播的播放终端。主要用于银行、部门机构、酒店等场所的网络广播、网络对讲。本产品配置了麦克风和3W扬声器&#xff…