机器学习Opencv和SVM的车牌识别系统—计算机专业课程设计(毕业设计)

基于机器学习SVM的车牌识别系统

摘要

车牌识别是一项重要的模式识别研究方向,具有广泛的应用。它被视为安全和交通运行的核心技术,可用于自动收费、交通管制、边境保护、车辆盗窃等重要领域。然而,在某些情况下,由于车牌颜色不同而无法很好地工作。因此,车牌识别不仅具有广泛的应用,而且具有重要的研究意义。
本文提出了一种基于OpenCV和SVM的车牌识别系统。该系统通过对车牌图像进行预处理、特征提取和分类,实现对车牌的自动识别。具体来说,本文首先对车牌图像进行预处理,包括图像增强、去噪、二值化等操作,提高车牌图像的质量。然后,本文采用颜色特征、形状特征和纹理特征对车牌图像进行特征提取,提高车牌图像的识别准确性。最后,本文采用SVM算法对车牌图像进行分类,实现对车牌的自动识别。通过实验验证,本文所设计的车牌识别系统具有较高的识别准确性和速度,可以满足实际应用的需求。

调试导入和运行结果图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

导入操作步骤

  1. 本地安装python和pycharm, 解压源代码文件,导入pycharm
  2. 在pycharm的setting中设置好venv虚拟环境
  3. 在虚拟环境中安装好对应的包
matplotlib
numpy
opencv-python
opencv-python-headless
Pillow
PyQt5
  1. 安装完成后运行mian_ui.py就可以打开GUI界面了
  2. 安装路径下不要有中文,opencv会报错

报告和答辩PPT

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关键代码

import os
import cv2
import random
import numpy as np

class SVM(object):
    def __init__(self, fn):
        self.fn = fn
        if os.path.exists(self.fn): #判断模型是否已经训练过了
            self.model = cv2.ml.SVM_load(self.fn) #如果模型已经训练过,则加载训练好的模型
        else:
            self.model = cv2.ml.SVM_create() #否则创建分类器,重新进行训练

    def train(self, samples, responses): #模型训练代码,samples为样本,responses为结果
        self.model.setKernel(cv2.ml.SVM_INTER) #使用线性核
        self.model.train(samples, cv2.ml.ROW_SAMPLE, responses) #对数据进行训练
        self.model.save(self.fn) #保存训练模型

    def predict(self, samples): #模型预测代码,samples为样本
        _, pred = self.model.predict(samples)
        return pred.ravel()

class Reader(object): #读取数据
    def __init__(self) -> None:
        self.svms2 = SVM('./param/chars2.svm') #读取字符数据
        self.svmsChinese = SVM('./param/chars2Chinese.svm') #读取汉字数据
        self.groups2 = np.load('./param/chars2.npy') #读取字符标签
        self.groupsChinese = np.load('./param/charsChinese.npy') #读取汉字标签


    def recognize_alnum(self, img) -> str: #识别字符
        ret = self.svms2.predict(img.reshape((1, -1)).astype('float32')).astype('int32')
        return self.groups2[ret]

    def recognize_chinese(self, img) -> str: #识别汉字
        ret = self.svmsChinese.predict(img.reshape((1, -1)).astype('float32')).astype('int32')
        return self.groupsChinese[ret]

def test():
    dataset_root = './dataset'
    # datasets = ['chars2']
    datasets = ['charsChinese']
    data = []
    groups = []
    for dataset in datasets:
        for group in os.listdir(dataset_root + 
                                '/' + dataset):
            for image in os.listdir(dataset_root + 
                                    '/' + dataset + 
                                    '/' + group):
                data.append(np.append(cv2.imread(dataset_root + 
                                                 '/' + dataset + 
                                                 '/' + group + 
                                                 '/' + image, 0).ravel(), len(groups)))
            groups.append(group)

    # np.save('./chars2.npy', np.array(groups))

    random.shuffle(data)
    data = np.array(data).astype('float32')

    len_train = (int)(data.shape[0] * 0.8)
    data_train = data[:len_train]
    data_pred = data[len_train:]

    svm = SVM('./chars2Chinese.svm')
    # svm.train(data_train[:, :-1], data_train[:, -1].ravel().astype('int32'))
    pred = svm.predict(data[:, :-1])
    print('accuracy: ', np.sum(pred == data[:, -1]) / pred.ravel().shape[0])


if __name__ == '__main__':
    reader = Reader()
    # img = cv2.imread('./dataset/chars2/V/gt_215_2.jpg', 0)
    # txt = reader.recognize_alnum(img)
    img = cv2.imread('./dataset/charsChinese/zh_shan/debug_chineseMat477.jpg', 0)
    txt = reader.recognize_chinese(img)
    print(txt)

猜你喜欢

转载自blog.csdn.net/shooter7/article/details/129935028
今日推荐