SVM+opencv实现车牌识别(含完整代码)

本文介绍利用OpenCV基础知识实现车牌识别,包括找到车牌位置、分割车牌字符、模板匹配识别字符及输出结果四个步骤。还对比了传统图像处理与深度学习的优缺点,最后附上完整代码,并提供车牌号识别模板的下载资源。

目录

前言

一、思路

二、实现

2.1 预处理

2.1.1 导入所需模块

2.1.2 定义显示函数和高斯滤波灰度处理函数

2.2提取车牌位置

2.2.1原图

2.2.2 图像二值化

2.2.3 从图像中提取对表达和描绘区域形状有意义的图像分量--闭操作

2.2.4 获得轮廓并截取图像

 2.2.5 车牌二值化

 2.2.6 车牌字符分割

2.3 模板匹配识别字符

2.3.1 模板匹配重复性操作

2.3.2 输出结果

2.3.3 结果可视化

三、实现附上完整代码

四、资源


前言

利用OpenCV基础知识实现车牌识别

注:本文会将代码逐条分解,若觉得easy的可直接跳到最后,看如何在自己电脑上运行。


一、思路

OpenCV实现车牌号识别分四个步骤:
(1)找到车牌位置,将车牌从图中分割出来;
(2)将车牌各个字符分割开,单个字符闭合细小连接;
(3)通过模版匹配识别字符;
(4)输出匹配结果。
相比于深度学习,传统图像处理:
优点:不需要大量的数据集去训练模型,通过形态学、边缘检测等操作提取特征
缺点:基于传统图像处理的图像识别代码的泛化性低,图像的角度,明亮不同时,识别效果会非常差。

二、实现

2.1 预处理

2.1.1 导入所需模块

import cv2
from matplotlib import pyplot as plt
import os
import numpy as np

2.1.2 定义显示函数和高斯滤波灰度处理函数


# plt显示彩色图片,cv2与plt的图像通道不同:cv2为[b,g,r];plt为[r, g, b]
def plt_show0(img):
    b,g,r = cv2.split(img)
    img = cv2.merge([r, g, b])
    plt.imshow(img)
    plt.show()
  
# plt显示灰度图片
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

2.2提取车牌位置

2.2.1原图

2.2.2 图像二值化

# 读取待检测图片->传入需要检测的图片路径
origin_image = cv2.imread('car.jpg')
# 复制一张图片,在复制图上进行图像操作,保留原图
image = origin_image.copy()
# 图像去噪灰度处理
gray_image = gray_guss(image)
# x方向上的边缘检测(增强边缘信息)
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)

2.2.3 从图像中提取对表达和描绘区域形状有意义的图像分量--闭操作

# 形态学(从图像中提取对表达和描绘区域形状有意义的图像分量)——闭操作
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 10))
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernelX,iterations = 1)

# 腐蚀(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)

2.2.4 获得轮廓并截取图像

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.5)) and (weight < (height * 6)):
        image = origin_image[y:y + height, x:x + weight]
        plt_show0(image)

 2.2.5 车牌二值化

#车牌字符分割
# 图像去噪灰度处理
gray_image = gray_guss(image)
# 图像阈值化操作——获得二值化图   
ret, image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_OTSU)

#膨胀操作,使“苏”字膨胀为一个近似的整体,为分割做准备
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
image = cv2.dilate(image, kerne
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值