0

0

基于Opencv的Python车牌识别实战【一键运行】

P粉084495128

P粉084495128

发布时间:2025-07-24 10:52:10

|

356人浏览过

|

来源于php中文网

原创

该项目基于Python和OpenCV实现车牌识别,含图像预处理、定位、分割及模板匹配等步骤。先通过灰度转换、噪声过滤等预处理图像,再经形态学操作定位车牌,分割字符后按位置排序,最后用模板匹配识别字符,可输出车牌号码,在智能交通等领域实用。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

基于opencv的python车牌识别实战【一键运行】 - php中文网

基于Opencv的Python车牌识别实战【一键运行】

基于Opencv的Python车牌识别实战【一键运行】 - php中文网

一. 项目背景

一键运行

该项目旨在通过Python编程语言结合OpenCV库,实现一个完整的车牌识别系统。项目将演示从图像预处理到车牌定位、分割,以及最终通过模板匹配技术实现车牌号码的自动识别。这一技术在智能交通、车辆管理和监控等领域具有显著的实际应用价值,能够显著提升交通管理的效率和准确性。

基于Opencv的Python车牌识别实战【一键运行】 - php中文网

二. 项目亮点

  • OpenCV应用:本项目采用OpenCV这一强大的图像处理和计算机视觉库,实现高效的图像分析和处理功能。OpenCV的集成使得车牌识别过程更加精确和快速。

  • Python编程:选择Python作为开发语言,得益于其简洁的语法和丰富的库支持,使得开发过程更加高效。Python的易学性和广泛的社区资源为项目提供了强大的后盾。

    立即学习Python免费学习笔记(深入)”;

  • 高级图像处理:项目中运用了多种高级图像处理技术,包括但不限于灰度转换以增强图像对比度、噪声过滤以净化图像质量、边缘检测以识别图像轮廓、形态学操作以改善图像结构,以及透视变换以校正图像视角。

  • 创新算法集成:通过结合多种图像处理技术,项目开发了一套创新的算法流程,有效提升了车牌识别的准确性和鲁棒性,特别是在复杂环境下的表现。

  • 实用性与灵活性:项目不仅注重技术实现,还强调算法的实用性和灵活性,确保能够适应不同的应用场景和需求,如智能交通监控、车辆自动登记等。

基于Opencv的Python车牌识别实战【一键运行】 - php中文网

三. 技术原理

OpenCV(Open Source Computer Vision Library)是一个功能强大的开源计算机视觉库,广泛应用于图像处理和计算机视觉任务。它提供了丰富的算法和功能,包括但不限于图像处理、视频分析、物体识别、机器学习等 。

AI Web Designer
AI Web Designer

AI网页设计师,快速生成个性化的网站设计

下载

技术原理方面,OpenCV主要基于以下几个方面:

  • 图像表示:图像在OpenCV中通常以矩阵的形式表示,其中每个元素对应图像的一个像素点,像素值通常以BGR格式存储 。
  • 图像处理技术:OpenCV提供了大量的图像处理技术,如灰度化、噪声去除、边缘检测、形态学操作、透视变换等 。
  • 特征提取:在图像处理的基础上,OpenCV能够进行特征提取,例如角点检测、斑点检测等,这些特征可以用于后续的图像分析 。
  • 目标检测与跟踪:OpenCV实现了多种目标检测算法,如Haar Cascade、HOG等,以及目标跟踪算法,如CamShift、MeanShift等 。
  • 深度学习集成:OpenCV的dnn模块支持多种深度学习框架,可以加载预训练模型进行图像分类、目标检测等任务 。
  • OpenCV的架构主要由核心模块、高级模块、辅助模块以及接口和平台适配组成。核心模块提供图像处理和计算机视觉的基础功能,高级模块提供更复杂的视觉功能,辅助模块提供文件读写等辅助功能,接口和平台适配使得OpenCV可以跨语言和平台使用 。
基于Opencv的Python车牌识别实战【一键运行】 - php中文网

在实际应用中,OpenCV可以用于人脸检测、物体识别、图像拼接、视频分析等多种场景。例如,使用Haar Cascade算法可以检测图像中的人脸位置,物体识别可以通过深度学习算法实现,图像拼接可以通过Stitcher类将多个图像拼接成一个大视场图像 。

基于Opencv的Python车牌识别实战【一键运行】 - php中文网

四. 代码实现

4.1. 导入依赖

In [323]
import cv2from matplotlib import pyplot as pltimport osimport numpy as npfrom PIL import ImageFont, ImageDraw, Image

4.2. 图像预处理

cv2.GaussianBlur参数说明:

  • src:输入图像,可以是任意数量的通道,这些通道可以独立处理,但深度应为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。
  • ksize:高斯核的大小,必须是正奇数,例如 (3, 3)、(5, 5) 等。如果 ksize 的值为零,那么它会根据 sigmaX 和 sigmaY 的值来计算。
  • sigmaX:X 方向上的高斯核标准偏差。
  • dst:输出图像,大小和类型与 src 相同。
  • sigmaY:Y 方向上的高斯核标准偏差,如果 sigmaY 是零,那么它会与 sigmaX 的值相同。如果 sigmaY 是负数,那么它会从 ksize.width 和 ksize.height 计算得出。
  • borderType:像素外插法,有默认值。
In [324]
def plt_show0(img):
    b,g,r = cv2.split(img)
    img = cv2.merge([r, g, b])
    plt.imshow(img)
    plt.show()def plt_show(img):
    plt.imshow(img,cmap='gray')
    plt.show()def gray_guss(image):
    image = cv2.GaussianBlur(image, (3, 3), 0)
    gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)    return gray_image

运行下面的cell,显示处理的原始图片

In [325]
from IPython.display import Image# 显示图片Image(filename='work/1.jpeg')
<IPython.core.display.Image object>
In [326]
origin_image = cv2.imread('work/1.jpeg')# 高斯去噪image = origin_image.copy()
gray_image = gray_guss(image)
Sobel_x = cv2.Sobel(gray_image, cv2.CV_16S, 1, 0)
absX = cv2.convertScaleAbs(Sobel_x)
image = absX# 图像阈值化操作——获得二值化图ret, image = cv2.threshold(image, 0, 255, cv2.THRESH_OTSU)# 显示灰度图像plt_show(image)
<Figure size 640x480 with 1 Axes>

4.3. 车牌定位

In [327]
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 10))
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernelX,iterations = 1)# 显示灰度图像plt_show(image)
<Figure size 640x480 with 1 Axes>
In [328]
# 腐蚀(erode)和膨胀(dilate)kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 1))
kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20))#x方向进行闭操作(抑制暗细节)image = cv2.dilate(image, kernelX)
image = cv2.erode(image, kernelX)#y方向的开操作image = cv2.erode(image, kernelY)
image = cv2.dilate(image, kernelY)# 中值滤波(去噪)image = cv2.medianBlur(image, 21)# 显示灰度图像plt_show(image)
<Figure size 640x480 with 1 Axes>
In [329]
contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for item in contours:
    rect = cv2.boundingRect(item)
    x = rect[0]
    y = rect[1]
    weight = rect[2]
    height = rect[3]    # 根据轮廓的形状特点,确定车牌的轮廓位置并截取图像
    if (weight > (height * 3)) and (weight < (height * 4.5)):
        image = origin_image[y:y + height, x:x + weight]
        plt_show(image)
<Figure size 640x480 with 1 Axes>

运行下面的cell,对车牌字符分割

In [330]
# 图像去噪灰度处理gray_image = gray_guss(image)
ret, image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_OTSU) # 阈值化plt_show(image)
<Figure size 640x480 with 1 Axes>
In [331]
#膨胀操作kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4))
image = cv2.dilate(image, kernel)
plt_show(image)
<Figure size 640x480 with 1 Axes>

运行下面的cell,对车牌号排序

In [332]
# 查找轮廓contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
words = []
word_images = []#对所有轮廓逐一操作for item in contours:
    word = []
    rect = cv2.boundingRect(item)
    x = rect[0]
    y = rect[1]
    weight = rect[2]
    height = rect[3]
    word.append(x)
    word.append(y)
    word.append(weight)
    word.append(height)
    words.append(word)


words = sorted(words,key=lambda s:s[0],reverse=False)
i = 0#word中存放轮廓的起始点和宽高for word in words:    # 筛选字符的轮廓
    if (word[3] > (word[2] * 1.5)) and (word[3] < (word[2] * 5.5)) and (word[2] > 10):
        i = i+1
        if word[2] < 15:
            splite_image = image[word[1]:word[1] + word[3], word[0]-word[2]:word[0] + word[2]*2]        else:
            splite_image = image[word[1]:word[1] + word[3], word[0]:word[0] + word[2]]
        word_images.append(splite_image)
In [333]
for i,j in enumerate(word_images):  
    plt.subplot(1,7,i+1)
    plt.imshow(word_images[i],cmap='gray')
plt.show()
<Figure size 640x480 with 7 Axes>

4.4. 模版匹配

解压模版文件,文件路径在/home/aistudio/work/Template.zip,运行完之后可以注释下面的cell

In [334]
%%capture
!unzip /home/aistudio/work/Template.zip -d /home/aistudio/work
In [335]
# 准备模板(template[0-9]为数字模板;)template = ['0','1','2','3','4','5','6','7','8','9',            'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z',            '藏','川','鄂','甘','赣','贵','桂','黑','沪','吉','冀','津','晋','京','辽','鲁','蒙','闽','宁',            '青','琼','陕','苏','皖','湘','新','渝','豫','粤','云','浙']# 读取一个文件夹下的所有图片,输入参数是文件名,返回模板文件地址列表def read_directory(directory_name):
    referImg_list = []    for filename in os.listdir(directory_name):
        referImg_list.append(directory_name + "/" + filename)    return referImg_list# 获得中文模板列表(只匹配车牌的第一个字符)def get_chinese_words_list():
    chinese_words_list = []    for i in range(34,64):        #将模板存放在字典中
        c_word = read_directory('/home/aistudio/work/Template/'+ template[i])
        chinese_words_list.append(c_word)    return chinese_words_list
chinese_words_list = get_chinese_words_list()# 获得英文模板列表(只匹配车牌的第二个字符)def get_eng_words_list():
    eng_words_list = []    for i in range(10,34):
        e_word = read_directory('/home/aistudio/work/Template/'+ template[i])
        eng_words_list.append(e_word)    return eng_words_list
eng_words_list = get_eng_words_list()# 获得英文和数字模板列表(匹配车牌后面的字符)def get_eng_num_words_list():
    eng_num_words_list = []    for i in range(0,34):
        word = read_directory('/home/aistudio/work/Template/'+ template[i])
        eng_num_words_list.append(word)    return eng_num_words_list
eng_num_words_list = get_eng_num_words_list()
In [336]
# 获得英文和数字模板列表(匹配车牌后面的字符)def get_eng_num_words_list():
    eng_num_words_list = []    for i in range(0,34):
        word = read_directory('/home/aistudio/work/Template/'+ template[i])
        eng_num_words_list.append(word)    return eng_num_words_list
eng_num_words_list = get_eng_num_words_list()# 读取一个模板地址与图片进行匹配,返回得分def template_score(template,image):
    #将模板进行格式转换
    template_img=cv2.imdecode(np.fromfile(template,dtype=np.uint8),1)
    template_img = cv2.cvtColor(template_img, cv2.COLOR_RGB2GRAY)    #模板图像阈值化处理——获得黑白图
    ret, template_img = cv2.threshold(template_img, 0, 255, cv2.THRESH_OTSU)#     height, width = template_img.shape#     image_ = image.copy()#     image_ = cv2.resize(image_, (width, height))
    image_ = image.copy()    #获得待检测图片的尺寸
    height, width = image_.shape    # 将模板resize至与图像一样大小
    template_img = cv2.resize(template_img, (width, height))    # 模板匹配,返回匹配得分
    result = cv2.matchTemplate(image_, template_img, cv2.TM_CCOEFF)    return result[0][0]# 对分割得到的字符逐一匹配def template_matching(word_images):
    results = []    for index,word_image in enumerate(word_images):        if index==0:
            best_score = []            for chinese_words in chinese_words_list:
                score = []                for chinese_word in chinese_words:
                    result = template_score(chinese_word,word_image)
                    score.append(result)
                best_score.append(max(score))
            i = best_score.index(max(best_score))            # print(template[34+i])
            r = template[34+i]
            results.append(r)            continue
        if index==1:
            best_score = []            for eng_word_list in eng_words_list:
                score = []                for eng_word in eng_word_list:
                    result = template_score(eng_word,word_image)
                    score.append(result)
                best_score.append(max(score))
            i = best_score.index(max(best_score))            # print(template[10+i])
            r = template[10+i]
            results.append(r)            continue
        else:
            best_score = []            for eng_num_word_list in eng_num_words_list:
                score = []                for eng_num_word in eng_num_word_list:
                    result = template_score(eng_num_word,word_image)
                    score.append(result)
                best_score.append(max(score))
            i = best_score.index(max(best_score))            # print(template[i])
            r = template[i]
            results.append(r)            continue
    return results


word_images_ = word_images.copy()# 调用函数获得结果result = template_matching(word_images_)print(result)print( "".join(result))
['渝', 'B', 'F', 'U', '8', '7', '1']
渝BFU871

4.5. 结果展示

In [337]
import cv2from matplotlib import pyplot as pltimport osimport numpy as npfrom PIL import ImageFont, ImageDraw, Image

height,weight = origin_image.shape[0:2]


image_1 = origin_image.copy()
cv2.rectangle(image_1, (int(0.2*weight), int(0.75*height)), (int(weight*0.9), int(height*0.95)), (0, 255, 0), 5)#设置需要显示的字体fontpath = "/home/aistudio/work/simsun.ttc"font = ImageFont.truetype(fontpath,64)
img_pil = Image.fromarray(image_1)
draw = ImageDraw.Draw(img_pil)#绘制文字信息draw.text((int(0.2*weight)+25, int(0.75*height)),  "".join(result), font = font, fill = (255, 255, 0))
bk_img = np.array(img_pil)print(result)print( "".join(result))
plt_show0(bk_img)
['渝', 'B', 'F', 'U', '8', '7', '1']
渝BFU871
<Figure size 640x480 with 1 Axes>

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号