当前位置:   article > 正文

毕业设计:python车牌识别系统 CNN算法 卷积神经网络网络 深度学习 tensorflow(源码)✅_车牌识别python加cnn

车牌识别python加cnn

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌感兴趣的可以先收藏起来,点赞、关注不迷路✌

毕业设计:2023-2024年计算机毕业设计1000套(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕业设计选题汇总

1、项目介绍

技术栈:
Python语言、CNN算法、tensorflow 和 keras、深度学习、opencv、pyqt5图形界面

2、项目界面

(1)上传图像进行车牌识别1
在这里插入图片描述

(2)上传图像进行车牌识别2
在这里插入图片描述

(3)上传图像进行车牌识别3
在这里插入图片描述

(4)上传视频进行车牌识别
在这里插入图片描述

3、项目说明

车牌识别系统是一种利用计算机视觉和深度学习技术来自动识别和提取车辆上的车牌信息的系统。它通常由以下几个主要组成部分构成:

图像采集:系统需要获取车辆图像或视频流。这可以通过摄像头、监控摄像机或其他图像采集设备实现。

图像预处理:对采集到的图像进行预处理,包括图像去噪、增强、调整尺寸等操作,以便提高后续识别算法的效果。

车牌定位:使用基于图像处理和机器学习的方法,对图像中的车牌位置进行定位和标定。这可能涉及到边缘检测、颜色过滤、形状匹配等技术。

字符分割:将车牌图像中的字符分割成单个字符。这是一个关键的步骤,通常使用图像处理和机器学习的方法来确定字符的边界。

字符识别:使用深度学习算法(如CNN)对分割出的字符进行识别。通过训练模型并应用模型进行分类,将字符转化为对应的文字或数字。

结果输出:将识别出的车牌信息输出到用户界面、数据库或其他系统中,以便进一步处理和应用。

在实现车牌识别系统时,Python语言常被用于图像处理和深度学习任务。OpenCV库提供了一系列强大的图像处理函数,可以用于图像预处理、边缘检测等操作。TensorFlow和Keras是流行的深度学习库,它们提供了丰富的工具和函数来构建和训练CNN模型。PyQt5是一个基于Python的GUI开发框架,可以用于创建用户界面,以实现与用户的交互和结果展示。

总之,车牌识别系统利用Python编程语言、CNN算法、TensorFlow和Keras深度学习库、OpenCV图像处理库以及PyQt5图形界面开发框架等技术实现车牌图像的自动识别和字符提取功能。

4、核心代码


import tkinter

import os
from tkinter import *
from tkinter.filedialog import askopenfilename

import cv2
import numpy as np
from PIL import Image, ImageTk

from tensorflow import keras

from CNN import cnn_predict
from Unet import unet_predict
# from a.a.vidGUI import VidWindow
from core import locate_and_correct
from imgtovid import images_to_video




class ImgWindow:
    def __init__(self, win, ww, wh):
        self.win = win
        self.ww = ww
        self.wh = wh
        self.win.title("车牌识别系统--图像处理模块")
        self.win.geometry("%dx%d+%d+%d" % (ww, wh, 200, 50))
        self.img_src_path = None


        self.can_src = Canvas(self.win, width=512, height=512, bg='white', relief='solid', borderwidth=1)
        self.can_src.place(x=50, y=35)

        self.textlabe = Label(text="图像处理", fg="white", bg='black', font=("微软雅黑", 18))
        self.textlabe.place(x=750, y=15)

        self.can_lic1 = Canvas(self.win, width=245, height=85, bg='white', relief='solid', borderwidth=1)
        self.can_lic1.place(x=670, y=60)

        self.can_pred1 = Canvas(self.win, width=245, height=65, bg='white', relief='solid', borderwidth=1)
        self.can_pred1.place(x=670, y=170)

        self.can_lic2 = Canvas(self.win, width=245, height=85, bg='white', relief='solid', borderwidth=1)
        self.can_lic2.place(x=670, y=275)

        self.can_pred2 = Canvas(self.win, width=245, height=65, bg='white', relief='solid', borderwidth=1)
        self.can_pred2.place(x=670, y=385)


        self.button1 = Button(self.win, text='选择文件', width=10, height=1, command=self.load_show_img)
        self.button1.place(x=600, y=520)

        self.button2 = Button(self.win, text='车牌定位', width=10, height=1, command=self.display)
        self.button2.place(x=700, y=520)

        self.button3 = Button(self.win, text='识别车牌', width=10, height=1, command=self.display2)
        self.button3.place(x=800, y=520)

        self.button4 = Button(self.win, text='清空所有', width=10, height=1, command=self.clear)
        self.button4.place(x=900, y=520)

        self.button5 = Button(self.win, text='视频处理', width=8, height=1, command=self.back, bg="DimGray")
        self.button5.place(x=670, y=20)

        self.unet = keras.models.load_model('unet.h5')
        self.cnn = keras.models.load_model('cnn.h5')

        print('正在启动中,请稍等...')

        cnn_predict(self.cnn, [np.zeros((80, 240, 3))])

        print("已启动,开始识别吧!")

    def back(self):
        self.win.destroy()

        win2 = Tk()
        ww = 1000
        wh = 600

        img_gif = tkinter.PhotoImage(file="3.gif")
        label_img = tkinter.Label(win2, image=img_gif, width="1000", height="600")
        label_img.place(x=0, y=0)
        VidWindow(win2, ww, wh)
        screenWidth, screenHeight = win2.maxsize()
        geometryParam = '%dx%d+%d+%d' % (
            ww, wh, (screenWidth - ww) / 2, (screenHeight - wh) / 2)
        win2.geometry(geometryParam)
        win2.mainloop()


    def load_show_img(self):
        self.clear()
        sv = StringVar()
        sv.set(askopenfilename())
        self.img_src_path = Entry(self.win, state='readonly', text=sv).get()
        #print(self.img_src_path)
        img_open = Image.open(self.img_src_path)
        if img_open.size[0] * img_open.size[1] > 240 * 80:
            img_open = img_open.resize((512, 512), Image.ANTIALIAS) #图片 512x512
        self.img_Tk = ImageTk.PhotoImage(img_open)
        self.can_src.create_image(258, 258, image=self.img_Tk, anchor='center')


    def display(self):
        if self.img_src_path == None:
            self.can_pred1.create_text(32, 15, text='请选择图片', anchor='nw', font=('黑体', 28))
        else:
            img_src = cv2.imdecode(np.fromfile(self.img_src_path, dtype=np.uint8), -1)
            h, w = img_src.shape[0], img_src.shape[1]
            if h * w <= 240 * 80 and 2 <= w / h <= 5:  # 整个图片就是一张车牌无需定位
                lic = cv2.resize(img_src, dsize=(240, 80), interpolation=cv2.INTER_AREA)[:, :, :3]  # resize(240,80)
                img_src_copy, Lic_img = img_src, [lic]
            else:
                img_src, img_mask = unet_predict(self.unet, self.img_src_path)
                img_src_copy, Lic_img = locate_and_correct(img_src, img_mask)
                #cv2.imwrite('./pic3.jpeg',img_src_copy)


            Lic_pred = cnn_predict(self.cnn, Lic_img)  # 利用cnn进行车牌的识别预测,Lic_pred中存的是元祖(车牌图片,识别结果)
            if Lic_pred:
                img = Image.fromarray(img_src_copy[:, :, ::-1])  # img_src_copy[:, :, ::-1]将BGR转为RGB
                self.img_Tk = ImageTk.PhotoImage(img)
                self.can_src.delete('all')
                self.can_src.create_image(258, 258, image=self.img_Tk,
                                          anchor='center')
                for i, lic_pred in enumerate(Lic_pred):
                    if i == 0:
                        self.lic_Tk1 = ImageTk.PhotoImage(Image.fromarray(lic_pred[0][:, :, ::-1]))
                        self.can_lic1.create_image(5, 5, image=self.lic_Tk1, anchor='nw')
                    elif i == 1:
                        self.lic_Tk2 = ImageTk.PhotoImage(Image.fromarray(lic_pred[0][:, :, ::-1]))
                        self.can_lic2.create_image(5, 5, image=self.lic_Tk2, anchor='nw')
            else:
                self.can_pred1.create_text(47, 15, text='未能识别', anchor='nw', font=('黑体', 27))


    def display2(self):
        if self.img_src_path == None:
            self.can_pred1.create_text(32, 15, text='请选择图片', anchor='nw', font=('黑体', 28))
        else:
            img_src = cv2.imdecode(np.fromfile(self.img_src_path, dtype=np.uint8), -1)
            h, w = img_src.shape[0], img_src.shape[1]
            if h * w <= 240 * 80 and 2 <= w / h <= 5:
                lic = cv2.resize(img_src, dsize=(240, 80), interpolation=cv2.INTER_AREA)[:, :, :3]
                img_src_copy, Lic_img = img_src, [lic]
            else:
                img_src, img_mask = unet_predict(self.unet, self.img_src_path)
                img_src_copy, Lic_img = locate_and_correct(img_src, img_mask)
                #cv2.imwrite('./pic3.jpeg',img_src_copy)


            Lic_pred = cnn_predict(self.cnn, Lic_img)
            if Lic_pred:
                for i, lic_pred in enumerate(Lic_pred):
                    if i == 0:
                        self.lic_Tk1 = ImageTk.PhotoImage(Image.fromarray(lic_pred[0][:, :, ::-1]))
                        self.can_lic1.create_image(5, 5, image=self.lic_Tk1, anchor='nw')
                        self.can_pred1.create_text(35, 15, text=lic_pred[1], anchor='nw', font=('黑体', 28))
                    elif i == 1:
                        self.lic_Tk2 = ImageTk.PhotoImage(Image.fromarray(lic_pred[0][:, :, ::-1]))
                        self.can_lic2.create_image(5, 5, image=self.lic_Tk2, anchor='nw')
                        self.can_pred2.create_text(40, 15, text=lic_pred[1], anchor='nw', font=('黑体', 28))
            else:
                self.can_pred1.create_text(47, 15, text='未能识别', anchor='nw', font=('黑体', 27))

    def clear(self):
        self.can_src.delete('all')
        self.can_lic1.delete('all')
        self.can_lic2.delete('all')
        self.can_pred1.delete('all')
        self.can_pred2.delete('all')
        self.img_src_path = None


if __name__ == '__main__':
    win = Tk()
    ww = 1000
    wh = 600
    img_gif = tkinter.PhotoImage(file="2.gif")
    label_img = tkinter.Label(win, image=img_gif, width="1000", height="600")
    label_img.place(x=0, y=0)
    ImgWindow(win, ww, wh)
    screenWidth, screenHeight = win.maxsize()
    geometryParam = '%dx%d+%d+%d' % (
    ww, wh, (screenWidth - ww) / 2, (screenHeight - wh) / 2)
    win.geometry(geometryParam)
    win.mainloop()


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/851397
推荐阅读
相关标签