(1)提取车牌位置,将车牌从图中分割出来;
(2)车牌字符的分割;
(3)通过模版匹配识别字符;
(4)将结果绘制在图片上显示出来。


import cv2
from matplotlib import pyplot as plt
import os
import numpy as np# plt显示彩色图片
def plt_show0(img):# cv2与plt的图像通道不同:cv2为[b,g,r];plt为[r, g, b]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
# 读取待检测图片
origin_image = cv2.imread('img。png')# 复制一张图片,在复制图上进行图像操作,保留原图
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)
# 形态学(从图像中提取对表达和描绘区域形状有意义的图像分量)——闭操作
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 10))
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernelX,iterations = 1)
# 显示灰度图像
plt_show(image)# 腐蚀(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)
# 获得轮廓
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 * 4)):image = origin_image[y:y + height, x:x + weight]plt_show0(image)#车牌字符分割
# 图像去噪灰度处理
gray_image = gray_guss(image)# 图像阈值化操作——获得二值化图
ret, image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_OTSU)
plt_show(image)#膨胀操作,使“苏”字膨胀为一个近似的整体,为分割做准备
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
image = cv2.dilate(image, kernel)
plt_show(image)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
for word in words:if (word[3] > (word[2] * 1.5)) and (word[3] < (word[2] * 3.5)) and (word[2] > 25):i = i+1splite_image = image[word[1]:word[1] + word[3], word[0]:word[0] + word[2]]word_images.append(splite_image)print(i)
print(words)for i,j in enumerate(word_images):plt.subplot(1,7,i+1)plt.imshow(word_images[i],cmap='gray')
plt.show()#模版匹配
# 准备模板(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('./refer1/'+ 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('./refer1/'+ 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('./refer1/'+ 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)image_ = image.copy()height, width = image_.shapetemplate_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)continueif 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)continueelse: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)continuereturn results
word_images_ = word_images.copy()
result = template_matching(word_images_)
print(result)print( "".join(result))
# 未完结----------------

opencv--车牌识别相关推荐

  1. opencv车牌识别入门资料汇总

    使用OpenCV和C++实现的车牌识别系统. http://download.csdn.net/detail/u014743238/7204477 使用VC++6.0做开发工具, 采用简单的SDI框架 ...

  2. 【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目

    车牌识别基础功能演示 摘要:车牌识别系统(Vehicle License Plate Recognition,VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息(含汉字字符.英文字母.阿 ...

  3. PyTorch + openCV 车牌识别(一)

    PyTorch + openCV 车牌识别(一) 注意 利用cv识别车牌并切割字符 注意 本项目仅是初学者学习pytorch过程中随手写的,有些地方不够严谨请谅解,仅供参考 利用cv识别车牌并切割字符 ...

  4. c# opencv车牌识别_毕设有着落了!一套开源的,基于SpringBoot的车牌识别系统

    阅读本文大概需要 4 分钟. 前言 这个项目是良月柒在逛社区时发现的,刚看到它,思绪直接被拉回了几年前,当初有同学的毕设就是停车场管理系统,关键的功能--车牌识别,连硬件都整上了,一整套流程跑下来,p ...

  5. c# opencv车牌识别_opencv +数字识别

    现在很多场景需要使用的数字识别,比如银行卡识别,以及车牌识别等,在AI领域有很多图像识别算法,大多是居于opencv 或者谷歌开源的tesseract 识别. 由于公司业务需要,需要开发一个客户端程序 ...

  6. Python 基于 opencv 车牌识别系统的研究与实现

    源码下载地址:https://download.csdn.net/download/gdutxiaoxu/87419195 原理简介 车牌字符识别使用的算法是opencv的SVM opencv的SVM ...

  7. 基于OpenCV车牌识别及轨迹跟踪

    系统总体设计 本系统主要由三个模块构成分别是:图像采集模块,车牌识别模块和轨迹处理模块. 因为实验条件限制,所以实验时采用一个摄像头拍多个不同时间段的视频,代替多个摄像头的拍摄效果.右图中小矩形框代表 ...

  8. spring boot + maven + opencv 车牌识别系统,包含车牌检测、车牌号识别训练

    yx-image-recognition 介绍 这是一个基于spring boot + maven + opencv 实现的图像识别及训练的Demo项目 包含车牌识别.人脸识别等功能,贯穿样本处理.模 ...

  9. python的opencv 车牌识别 开源_毕节进出口车牌识别系统怎么样

    毕节进出口车牌识别系统怎么样 gzheu8il 毕节进出口车牌识别系统怎么样 系统拓扑图如下:该系统以社区中心机房为枢纽,有机的将智慧家居住户.社区数字化服务.物业数字化管理.社区智能化管理结合起来, ...

  10. opencv 车牌识别---新能源车牌处理(二值化后按位取反)

    场景: 在对车牌号进行识别时,不能识别出新能源车牌的车牌号. 问题原因:   因为我们的识别模板都是黑底白字,新能源的车牌进行二值化处理后都是白地黑字. 模板: 新能源车牌原图(部分): 新能源车牌二 ...

最新文章

  1. 2560x1600分辨率高吗_手机屏幕分辨率真的越高越好?它的好处和坏处你知道吗?...
  2. 年轻程序员需要学习的5大经验
  3. JQUERY的html()
  4. MySQL和PostgreSQL的常用语法差异
  5. python替代php,Python架构的PHP替代方案
  6. mysql配置文件完全_MySQL配置文件my.cnf详解
  7. Android--JNI编程详解
  8. 团队转会名单(22日改)
  9. 尝试从远程计算机访问Web服务不显示调用按钮
  10. ActiveMQ 权限
  11. iOS项目开发实战——制作视图的缩放动画
  12. restful soap_Web服务面试问题– SOAP,RESTful
  13. SpringCloud_Eureka集群配置
  14. HDU-1009 做个骑士,以梦为马
  15. [软件应用]官方下载Nero-9.4.13.2d_update.exe迅雷竟也报毒
  16. wordpress 百度主动推送 PHP,WordPress 百度自动推送插件
  17. 国家统计局拟用大数据预测房价走势
  18. T和?是什么 ?有什么区别?
  19. PLM Agile BOM表结构笔记
  20. echarts渐变色

热门文章

  1. 2021年大数据Spark(五十二):Structured Streaming 事件时间窗口分析
  2. Python的re模块 --- 正则表达式操作
  3. 微信小程序点击右下角的图片移动到当前位置
  4. Android 动画的插值器 (Interpolator属性)
  5. 模拟文件上传(一):手动文件上传
  6. Java内存溢出详解之Tomcat配置
  7. TimeQuest学习之三------外部寄存器模型
  8. 设计模式——单例模式(Singleton)
  9. 事件绑定在IE下this是window的问题
  10. 使用 雨林木风 Ghost XP SP3 装机版 YN9.9 安装 Win7 (SP1)