目录

一、基础理论

1、思想

2、大致过程

二、详细过程

1、首先需要模板库

2、得到模板

3、原图限定大小

4、模板匹配

5、匹配所有子文件夹,保存最佳得分(最匹配项)

三、大致过程(细分类,节省时间)

1、汉字匹配

2、英文字符匹配

3、数字/英文匹配

4、显示

模板匹配总代码

参考资料


一、基础理论

1、思想

把提取到的每一张字符,和模板库中的所有字符进行对比

2、大致过程

先拿到模板库,把模板和待匹配的图像大小限制一致,匹配每一张子模板图,匹配每张模板图匹配后都会有一个得分,得分最高的最相近。再把每个子文件夹最高得分对比,用index找到最高的那个子文件夹下标,得到模板。

二、详细过程

1、首先需要模板库

模板库下载链接1:(推荐)

https://download.csdn.net/download/great_yzl/21974008

模板库下载链接2:(不推荐)

http://www.zengqiang.club/blog/34

一个大文件夹下包含很多子文件夹:

每一个子文件夹内包含该字符的一系列模板(为了更精确,牺牲了不少时间):

2、得到模板

# 路径path = 'Template/' + List[i] + '/' + filename# 1、得到模板template = cv.imdecode(np.fromfile(path, dtype=np.uint8), 1)    #彩(类似imread)gray = cv.cvtColor(template, cv.COLOR_RGB2GRAY)                 #灰ret, template = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)      #二值cv.imshow('template', template)cv.waitKey(0)

3、原图限定大小

# 2、原图限定大小(和模板相似)h, w = template.shapeimage = cv.resize(image, (w, h))cv.imshow('image_', image)cv.waitKey(0)

4、模板匹配

按照名称列表的方式,遍历模板库的所有子文件夹、子文件夹内的所有子图。

# 3、模板匹配,得到得分(匹配度越高,得分越大)result = cv.matchTemplate(image, template, cv.TM_CCOEFF)score.append(result[0][0])          #得分(每张模板图)

5、匹配所有子文件夹,保存最佳得分(最匹配项)

匹配所有子文件夹的子图:

# 模板匹配,得到得分(匹配度越高,得分越大)result = cv.matchTemplate(image, template, cv.TM_CCOEFF)score.append(result[0][0])          #得分(每张模板图)

每个文件夹的最佳得分:

# 一个文件夹的最高得分(得分越高,匹配度越高)best_score.append(max(score))# 根据所有文件夹的最佳得分确定下标index = best_score.index(max(best_score))+34

三、大致过程(细分类,节省时间)

由于第一个必定是汉字,第二个必定是英文字符,后面的必定是英文字符/数字,我们在那里只需要做相应的判断即可。节约了很多时间。

1、汉字匹配

# (1) 汉字(首个位置只能是汉字(省))(为了节约时间)if con == 0:# 遍历34——65文件夹(汉字)for i in range(34,65):# 单个图片的得分score = []ForderPath = 'Template/' + List[i]# 遍历单文件夹(每一个文件匹配)for filename in os.listdir(ForderPath):# 路径path = 'Template/' + List[i] + '/' + filename# 1、得到模板template = cv.imdecode(np.fromfile(path, dtype=np.uint8), 1)    #彩(类似imread)gray = cv.cvtColor(template, cv.COLOR_RGB2GRAY)                 #灰ret, template = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)      #二值# 2、原图限定大小(和模板相似)h, w = template.shapeimage = cv.resize(image, (w, h))cv.imshow('image_', image)cv.waitKey(0)# 3、模板匹配,得到得分(匹配度越高,得分越大)result = cv.matchTemplate(image, template, cv.TM_CCOEFF)score.append(result[0][0])          #得分(每张模板图)# 4、保存子文件夹的最高得分(得分越高,匹配度越高)best_score.append(max(score))# 5、根据所有文件夹的最佳得分确定下标index = best_score.index(max(best_score))+34

2、英文字符匹配

# (2) 字母(第二个位置只能为字母)elif con == 1:# 遍历10~34文件夹(字母文件夹)for i in range(10,34):# 单个图片的得分score = []ForderPath = 'Template/' + List[i]# 遍历单文件夹(每一个文件匹配)for filename in os.listdir(ForderPath):# 路径path = 'Template/' + List[i] + '/' + filename# 模板template = cv.imdecode(np.fromfile(path, dtype=np.uint8), 1)    #彩(类似imread)gray = cv.cvtColor(template, cv.COLOR_RGB2GRAY)                 #灰ret, template = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)      #二值h, w = template.shapeimage = cv.resize(image, (w, h))# 模板匹配,得到得分(匹配度越高,得分越大)result = cv.matchTemplate(image, template, cv.TM_CCOEFF)score.append(result[0][0])          #得分(每张模板图)# 一个文件夹的最高得分(得分越高,匹配度越高)best_score.append(max(score))# 根据所有文件夹的最佳得分确定下标index = best_score.index(max(best_score)) + 10

3、数字/英文匹配

# (3) 数字+字母else:# 遍历0~34文件夹(数字+字母)for i in range(34):# 单个图片的得分score = []ForderPath = 'Template/' + List[i]# 遍历单文件夹(每一个文件匹配)for filename in os.listdir(ForderPath):# 路径path = 'Template/' + List[i] + '/' + filename# 模板template = cv.imdecode(np.fromfile(path, dtype=np.uint8), 1)    #彩(类似imread)gray = cv.cvtColor(template, cv.COLOR_RGB2GRAY)                 #灰ret, template = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)      #二值h, w = template.shapeimage = cv.resize(image, (w, h))# 模板匹配,得到得分(匹配度越高,得分越大)result = cv.matchTemplate(image, template, cv.TM_CCOEFF)score.append(result[0][0])          #得分(每张模板图)# 一个文件夹的最高得分(得分越高,匹配度越高)best_score.append(max(score))# 根据所有文件夹的最佳得分确定下标index = best_score.index(max(best_score))

4、显示

在切割字符函数的尾部,所有字符切割完、立刻进行模板匹配,同一张车牌所有字符切割完毕后,进行显示。

# 显示识别结果(图像)Show_Result_Image()
# 显示识别结果(图像)
def Show_Result_Image():p = image_rect[0], image_rect[1]w, h = image_rect[2] , image_rect[3]# 框出车牌cv.rectangle(img, (p[0],p[1]), (p[0]+w, p[1]+h), (0,0,255), 2)# 输出字符(中文)result = Text(img, str(final_result), p, (255,0,0), 16)cv.imshow('result-%d'%count, result)# cv.waitKey(0)

模板匹配总代码

# 显示文字(中文)(用的PIL,RGB正常显示,即和opencv的RGB相反)
def Text(image, text, p, color, size):# cv2读取图片# BGR转RGB:cv2和PIL中颜色的hex码的储存顺序不同cv2_image = cv.cvtColor(image, cv.COLOR_RGB2BGR)pil_image = Image.fromarray(cv2_image)# PIL图片上打印汉字draw = ImageDraw.Draw(pil_image)  # 图片上打印font = ImageFont.truetype("./simhei.ttf", size, encoding="utf-8")  # 参数1:字体文件路径,参数2:字体大小draw.text((p[0]-60, p[1]-20), text, color, font=font)# PIL图片转cv2 图片cv2_result = cv.cvtColor(np.array(pil_image), cv.COLOR_RGB2BGR)# cv2.imshow("图片", cv2_result)      # 汉字窗口标题显示乱码# cv.imshow("photo", cv2_result)     # 输出汉字return cv2_result# 显示识别结果(文字)
def Show_Result_Words(index):print(List[index])final_result.append(List[index])print(final_result)# 显示识别结果(图像)
def Show_Result_Image():p = image_rect[0], image_rect[1]w, h = image_rect[2] , image_rect[3]# 框出车牌cv.rectangle(img, (p[0],p[1]), (p[0]+w, p[1]+h), (0,0,255), 2)# 输出字符(中文)result = Text(img, str(final_result), p, (255,0,0), 16)cv.imshow('result-%d'%count, result)# cv.waitKey(0)# 三、模板匹配
# 原图和模板进行对比,越匹配,得分越大
def Template_Match(image):# 单文件夹内的最佳得分best_score = []# 遍历所有文件夹(每一个文件夹匹配)# (1) 汉字(首个位置只能是汉字(省))(为了节约时间)if con == 0:# 遍历34——65文件夹(汉字)for i in range(34,65):# 单个图片的得分score = []ForderPath = 'Template/' + List[i]# 遍历单文件夹(每一个文件匹配)for filename in os.listdir(ForderPath):# 路径path = 'Template/' + List[i] + '/' + filename# 1、得到模板template = cv.imdecode(np.fromfile(path, dtype=np.uint8), 1)    #彩(类似imread)gray = cv.cvtColor(template, cv.COLOR_RGB2GRAY)                 #灰ret, template = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)      #二值# 2、原图限定大小(和模板相似)h, w = template.shapeimage = cv.resize(image, (w, h))# 3、模板匹配,得到得分(匹配度越高,得分越大)result = cv.matchTemplate(image, template, cv.TM_CCOEFF)score.append(result[0][0])          #得分(每张模板图)# 4、保存子文件夹的最高得分(得分越高,匹配度越高)best_score.append(max(score))# 5、根据所有文件夹的最佳得分确定下标index = best_score.index(max(best_score))+34# (2) 字母(第二个位置只能为字母)elif con == 1:# 遍历10~34文件夹(字母文件夹)for i in range(10,34):# 单个图片的得分score = []ForderPath = 'Template/' + List[i]# 遍历单文件夹(每一个文件匹配)for filename in os.listdir(ForderPath):# 路径path = 'Template/' + List[i] + '/' + filename# 模板template = cv.imdecode(np.fromfile(path, dtype=np.uint8), 1)    #彩(类似imread)gray = cv.cvtColor(template, cv.COLOR_RGB2GRAY)                 #灰ret, template = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)      #二值h, w = template.shapeimage = cv.resize(image, (w, h))# 模板匹配,得到得分(匹配度越高,得分越大)result = cv.matchTemplate(image, template, cv.TM_CCOEFF)score.append(result[0][0])          #得分(每张模板图)# 一个文件夹的最高得分(得分越高,匹配度越高)best_score.append(max(score))# 根据所有文件夹的最佳得分确定下标index = best_score.index(max(best_score)) + 10# (3) 数字+字母else:# 遍历0~34文件夹(数字+字母)for i in range(34):# 单个图片的得分score = []ForderPath = 'Template/' + List[i]# 遍历单文件夹(每一个文件匹配)for filename in os.listdir(ForderPath):# 路径path = 'Template/' + List[i] + '/' + filename# 模板template = cv.imdecode(np.fromfile(path, dtype=np.uint8), 1)    #彩(类似imread)gray = cv.cvtColor(template, cv.COLOR_RGB2GRAY)                 #灰ret, template = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)      #二值h, w = template.shapeimage = cv.resize(image, (w, h))# 模板匹配,得到得分(匹配度越高,得分越大)result = cv.matchTemplate(image, template, cv.TM_CCOEFF)score.append(result[0][0])          #得分(每张模板图)# 一个文件夹的最高得分(得分越高,匹配度越高)best_score.append(max(score))# 根据所有文件夹的最佳得分确定下标index = best_score.index(max(best_score))# 显示结果(文字)(每识别一个显示一次)Show_Result_Words(index)

总的来讲,为了追求较高的精度,匹配时间较长, 一张车牌约20秒。这里的模板匹配不算非常的精确,并且耗时严重,已经逐渐被淘汰了,这里只是作为学习用途,没有太高的实际应用价值。(后期进军深度学习/机器学习,可能会对这些进行优化)。有什么好的建议大家可以提出来,共同进步,谢谢~

参考资料

https://www.bilibili.com/video/BV1yg4y187kU?p=3

OpenCV(项目)车牌识别3 -- 模板匹配相关推荐

  1. 【车牌识别】模板匹配新能源、轿车、货车车牌识别【含GUI Matlab源码 2169期】

    ⛄一.模板匹配车牌识别简介 1 系统整体设计 车牌识别系统包括4个步骤:车牌定位 (包括识别图像中的车牌位置并将其分割) .图像处理.字符分割与字符识别, 如图1所示.车牌定位的主要功能是从图像中可能 ...

  2. 【车牌识别】模板匹配车牌库识别【含GUI Matlab源码 416期】

    ⛄一.车牌识别简介 车牌识别技术起源于20世纪80年代初期,图像模式识别和计算机视觉在其中起到至关重要的作用.随着计算机技术的迅速普及和进步,80年代中后期,车牌识别系统逐步投入市场并使用,但识别精度 ...

  3. 【车牌识别】模板匹配新能源车牌识别【含Matlab源码 865期】

    ⛄一.简介 1 在进行图像处理任务之前,首先要明确处理对象和处理流程 处理对象: 新能源车牌和蓝色车牌 处理流程: 2 由于要对蓝色和新能源车牌进行识别,而且新能源车牌是渐变色,所以直接通过设定阈值的 ...

  4. OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()

    OpenCV学习(二十三) :模板匹配:matchTemplate() 1.概述 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配 ...

  5. 开源项目车牌识别EasyPR的使用

    开源项目车牌识别EasyPR的使用 1.配置Visual studio+opencv 2.下载源码 https://gitee.com/easypr/EasyPR?hmsr=aladdin1e6 3. ...

  6. 【树莓派开发】02-基于OpenCV的车牌识别处理(LPR)

    [说明]:疫情期间比较闲学习了python.LPR这个东西,基于OpenCV已经做过很多遍了,通过这个小项目利用树莓派来熟悉Python编程,而且通过实际操作可以掌握一些具体的细节与技巧,这里我将整个 ...

  7. 2021-01-07 python opencv实现车牌识别 颜色定位

    python opencv实现车牌识别 颜色定位 主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https ...

  8. Python+Opencv简易车牌识别(二):形态学运算,HSV颜色空间筛选与图像分割

    注:这是依然一个简单的车牌识别demo 1.前言 在上一篇Python+Opencv简易车牌识别(一):基于HSV颜色空间的图像分割中,我们讲了如何仅基于颜色来进行简单粗暴的车牌分割.今天我们考虑对图 ...

  9. OpenCV中的图像处理 —— 傅里叶变换+模板匹配

    OpenCV中的图像处理 -- 傅里叶变换+模板匹配 现在也在逐渐深入啦,希望跟大家一起进步越来越强 目录 OpenCV中的图像处理 -- 傅里叶变换+模板匹配 1. 傅里叶变换 1.1 Numpy实 ...

最新文章

  1. 对比测试LM358, LMV358双运放基本参数,测试之后发现是假货
  2. MPLS标签分发、通告及管理方式
  3. java swt 双屏_Java中AWT、Swing与SWT三大GUI技术的原理与效率差异
  4. MySQL查询数据操作(DQL)
  5. c#补充print(多态性问题)【C#】
  6. 页面点击提交跳转_一个入口一次提交!“六税合一”综合申报操作指南请收好~...
  7. Apache服务安全加固及Apache优化
  8. 萌新接触前端的第三课——JavaScript
  9. 张樟兴策略分析:数据库营销顾客
  10. tftp 查看服务器文件夹,TFTP服务器的配置
  11. 图解物联网---物联网基础知识
  12. 【机器学习】网络表征学习、网络嵌入必读论文
  13. java mac算法_Mac算法的java实现
  14. 计算机桌面设置定时,电脑桌面定时提醒休息如何设置?
  15. 漫漫长路——微信十年历程
  16. Vue笔记 (二) 如何做移动端适配 让你只用关心设计稿
  17. 06-1-SVM原理
  18. 易文档(yidocs),更简单的markdown静态文档生成模板
  19. 科技百咖 | 天威诚信:韶光与共,不负前路
  20. 九度OJ-1163:素数(未关联)

热门文章

  1. Android 如何防止用户同时点击多个控件问题
  2. 微信小程序分享注意点
  3. A 'return' expression required in a function with a block body ('{...}')
  4. shell 跟踪命令
  5. 搭建 VUE + NODE.JS + ElementUI 学习过程中问题总结
  6. 打算看的书或正在看的书
  7. ASP.NET MVC3 在WebGrid中用CheckBox选中行
  8. 哈佛管理论丛:谁背上了令人讨厌的猴子
  9. php点击复制按钮到我的粘贴板,JS 实现点击按钮复制内容到粘贴板 clipboard
  10. 1164: 分治 逆序对