传统车牌识别

主要参考:https://blog.csdn.net/qq_40784418/article/details/105586644

其它介绍:

https://blog.csdn.net/great_yzl/article/details/120127962

https://blog.csdn.net/onepunch_k/article/details/115480904

cv2.matchTemplate

  • https://docs.opencv.org/3.4/d4/dc6/tutorial_py_template_matching.html

  • https://docs.opencv.org/3.4/df/dfb/group__imgproc__object.html#gga3a7850640f1fe1f58fe91a2d7583695dac5babb7dfda59544e3e31ea928f8cb16

  • https://blog.csdn.net/liyuanbhu/article/details/49837661

  • https://blog.csdn.net/m0_37579176/article/details/116950903

import cv2old_img = cv2.imread('che1.png')
temp_img = old_img.copy()
# cv2.imshow('img',old_img)
# cv2.waitKey(1000)
img = old_img.copy()
img = cv2.GaussianBlur(img,(3,3),0)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sobel_x = cv2.Sobel(img_gray,cv2.CV_16S,1,0)
img_edge = cv2.convertScaleAbs(sobel_x)
_, img = cv2.threshold(img_edge,0,255,cv2.THRESH_OTSU)
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT,(30,10))
img = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernelX,iterations=1)kernelX = cv2.getStructuringElement(cv2.MORPH_RECT,(50,1))
kernelY = cv2.getStructuringElement(cv2.MORPH_RECT,(1,20))
img = cv2.dilate(img,kernelX)
img = cv2.erode(img,kernelX)
img = cv2.erode(img,kernelY)
img = cv2.dilate(img,kernelY)
img = cv2.medianBlur(img,21)_, contours, _ = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
boxes = []
for contour in contours:rect = cv2.boundingRect(contour)x,y,w,h = rectif w*h < 100: continueif (w>h*2) and (w<h*4):boxes.append([x,y,w,h])cv2.rectangle(old_img, (x,y), (x+w, y+h), (255, 0, 0), 2)
boxes.sort(key=lambda i:i[1], reverse=True)
cv2.imshow('img',old_img)
cv2.waitKey(5000)
x,y,w,h = boxes[0]
img_crop = temp_img[y:y+h,x:x+w]
old_crop = img_crop.copy()
backup_crop = img_crop.copy()
cv2.imshow('img',img_crop)
cv2.waitKey(5000)img_crop = cv2.GaussianBlur(img_crop,(3,3),0)
crop_gray = cv2.cvtColor(img_crop, cv2.COLOR_BGR2GRAY)
_, crop_bin = cv2.threshold(crop_gray,0,255,cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(2,2))
crop_bin = cv2.dilate(crop_bin,kernel)
cv2.imshow('img',crop_bin)
cv2.waitKey(5000)_, contours, _ = cv2.findContours(crop_bin,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
zi_box = []
for contour in contours:rect = cv2.boundingRect(contour)x,y,w,h = rect# if w*h < 200 or w*h>3000: continueif (h>1.5*w) and (h<3*w):zi_box.append([x,y,w,h])cv2.rectangle(old_crop, (x,y), (x+w, y+h), (0, 0, 255), 2)
cv2.imshow('img',old_crop)
cv2.waitKey(5000)
zi_box.sort(key=lambda i:i[0],reverse=False)
print(zi_box)x,y,w,h= zi_box[1]
zi_crop = backup_crop[y:y+h,x:x+w]
print(zi_crop.shape)
cv2.imwrite('H.jpg',zi_crop)
cv2.imshow('img',zi_crop)
cv2.waitKey(5000)
cv2.destroyAllWindows()

import os
import cv2template_dir = './refer1'
template_body = []
for cls_name in os.listdir(template_dir):template_body.extend([[cls_name,template_dir+'/'+cls_name+'/'+i] for i in os.listdir(template_dir+'/'+cls_name)])
# print(template_body[0])img = cv2.imread('H.jpg',cv2.COLOR_BGR2GRAY)
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
w,h = img.shape
for index,item in enumerate(template_body):template = cv2.imread(item[1])template = cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)template = cv2.resize(template,(h,w))score = cv2.matchTemplate(img,template,cv2.TM_CCOEFF)[0,0]template_body[index].insert(0,score)
# print(template_body[0])
template_body.sort(key=lambda i:i[0],reverse=True)
print(template_body[0:3])

H.jpg

[[3810410.2, '桂', './refer1/桂/桂_70.jpg'],[3645890.0, 'B', './refer1/B/58.jpg'], 
[3608947.2, '0', './refer1/0/n24.jpg']]

9.jpg

[[3954204.5, '9', './refer1/9/10-0.jpg'], 
[3737860.2, '9', './refer1/9/3_0.855008_gray_12816_5036_step5_recog_3_9_0.976258_0.834708.jpg'],[3673604.2, '9', './refer1/9/5_0.950823_gray_3683_1554_step5_recog_5_9_0.991150_0.942408.jpg']]

沪.jpg

[[3371885.8, '沪', './refer1/沪/沪_220.jpg'], 
[3197117.8, '沪', './refer1/沪/沪_222.jpg'], 
[3157204.8, '沪', './refer1/沪/沪_221.jpg']]

TM_CCOEFF

import cv2
import numpy as npold_img = cv2.imread('che1.png')
img = cv2.resize(old_img,(100,120))
template = cv2.resize(old_img,(50,60))
result = cv2.matchTemplate(img,template,cv2.TM_CCOEFF)
print(result.shape)
print(result[0:2,0:2])i_rows,i_cols,_ = img.shape
h,w,_ = template.shape
diy = np.zeros((i_rows-h+1,i_cols-w+1))template_mean = np.mean(template,axis=(0,1),keepdims=True)
template_new = template - template_mean
template_line = template_new.reshape(-1,)for row_index in range(i_rows-h+1):for col_index in range(i_cols-w+1):img_crop = img[row_index:row_index+h,col_index:col_index+w]img_crop_mean = np.mean(img_crop,axis=(0,1),keepdims=True)img_crop_new = img_crop - img_crop_meanpixes_line = img_crop_new.reshape(-1,)diy[row_index,col_index] = np.dot(pixes_line,template_line)
print(diy.shape)
print(diy[0:2,0:2])

输出效果

(61, 51)
[[4881797. 4958400.][5048702. 5272232.]]
(61, 51)
[[4881795.811      4958397.90766667][5048704.82233333 5272229.10133333]]

GRAY

import cv2
import numpy as npold_img = cv2.imread('che1.png')
old_img = cv2.cvtColor(old_img,cv2.COLOR_BGR2GRAY)img = cv2.resize(old_img,(100,120))
template = cv2.resize(old_img,(50,60))
result = cv2.matchTemplate(img,template,cv2.TM_CCOEFF)
print(result.shape)
print(result[10:12,10:12])
# print(result)i_rows,i_cols = img.shape
h,w = template.shape
diy = np.zeros((i_rows-h+1,i_cols-w+1))template_mean = np.sum(template)/(w*h)
template_new = template - template_mean
template_line = template_new.reshape(-1,)for row_index in range(i_rows-h+1):for col_index in range(i_cols-w+1):img_crop = img[row_index:row_index+h,col_index:col_index+w]img_crop_mean = np.sum(img_crop)/(w*h)img_crop_new = img_crop - img_crop_meanpixes_line = img_crop_new.reshape(-1,)diy[row_index,col_index] = np.dot(pixes_line,template_line)
print(diy.shape)
print(diy[10:12,10:12])
# print(diy)

输出效果

(61, 51)
[[1911522.9 2079905.1][1861463.6 2019491.5]]
(61, 51)
[[1911525.84533333 2079907.06933333][1861462.65066667 2019491.51733333]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有个网友问Webview2如何另存为mhtml

有个网友问Webview2如何另存为mhtml 。俺查了一下&#xff0c;Webview2没有直接的saveas函数。然后我查到 之后我就使用 webview2 capture 这2个关键字去查询&#xff0c;果然搜到了 一段代码 然后我把这段代码 改成成C#的&#xff0c; string data await webView21.CoreWebV…

学会这几点,轻松制作引人入胜的电子期刊

随着数字化时代的到来&#xff0c;电子期刊已经成为了信息传播的重要载体。它以方便快捷、形式多样、互动性强等特点&#xff0c;受到了广泛的欢迎。那么&#xff0c;如何制作一份引人入胜的电子期刊呢&#xff1f;下面就来为大家分享几点制作电子期刊的小技巧。 1.选择合适的制…

你为什么学习c++?

C 是几乎所有现代面向对象语言的鼻祖&#xff08;注意是现代面向对象语言&#xff0c;还有一个“古代”面向对象&#xff0c;思想是消息传递而不是封装、继承与多态&#xff0c;Objective-C 就是消息传递的面向对象语言&#xff09;。刚好我有一些资料&#xff0c;是我根据网友…

vue2动态横条图(横条图样式定时切换)

每次切换成新图后会清除定时器和图&#xff08;重新加载&#xff0c;否则要么会重复加载定时器。清除定时器之后要先调用一次index为0的数据&#xff09; 数据样例 acrossBarDatas:{data: ["80", "80"],sunffix: [单位, "单位"],title: "标…

提取人脸——OpenCV

提取人脸 导入所需的库创建窗口显示原始图片显示检测到的人脸创建全局变量定义字体对象定义一个函数select_image定义了extract_faces函数设置按钮运行GUI主循环运行显示 导入所需的库 tkinter&#xff1a;用于创建图形用户界面。 filedialog&#xff1a;用于打开文件对话框。 …

链表OJ--超详细解析

链表OJ 文章目录 链表OJ1. 反转链表2. 返回K值3. 链表的中间节点4. 回文链表5. 相交链表6. 带环链表6.1 为什么一定会相遇&#xff0c;有没有可能会错过&#xff0c;或者出现永远追不上的情况&#xff0c;请证明6.2 slow一次走一步&#xff0c;fast如果一次走3步&#xff0c;走…

Jmeter如何进行分布式测试

使用Jmeter进行性能测试时&#xff0c;有些同学问我如果并发数比较大(比如最近项目需要支持1000并发)&#xff0c;单台电脑的配置(CPU和内存)可能无法支持&#xff0c;怎么办就需要使用分布式压测 1.分布式原理&#xff1a; 1、Jmeter分布式测试时&#xff0c;选择其中一台作…

Selenium IED-控制已打开的Chrome浏览器

本文已收录于专栏 《自动化测试》 目录 背景介绍优势特点操作步骤总结提升 背景介绍 在我们进行自动化测试的过程中有时候会遇见一个很棘手的问题那就是登录的过程中需要图片验证码&#xff0c;图片验证码设计的初衷其实就是为了防自动化&#xff0c;防止一些人利用自动工具恶意…

缓冲区设置

缓冲区设计 一、简介 在网络通讯中&#xff0c;用户态缓冲区和内核态缓冲区的大小设定对于优化网络性能和确保数据传输可靠性至关重要。下图是网路通讯的内核缓冲区使用情况&#xff1a; 数据的读写都需要进行系统调用&#xff0c;从用户态切换到内核态去接收数据&#xff0…

昂科烧录器支持TI德州仪器的超低功耗微控制器MSP430F2013IRSAR

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中TI德州仪器的超低功耗微控制器MSP430F2013IRSAR已经被昂科的通用烧录平台AP8000所支持。 MSP430F2013IRSAR超低功耗微控制器由多种设备组成&#xff0c;这些设备具有针对各种应…

集体爆雷!突发中科院2区(Top) 被标记!新增10本期刊被“On Hold“

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

Nginx缓存之web缓存配置

Web 缓存可节约网络带宽&#xff0c;有效提高用户打开网站的速度。由于应用服务器被请求次数的降低&#xff0c;也相对使它的稳定性得到了提升。Web 缓存从数据内容传输的方向分为前向位置缓存和反向位置缓存两类。如下图所示。 前向位置缓存既可以是用户的客户端浏览器&#x…

处理耗时任务

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 处理耗时任务 {public partial class Form1 : Form{public Form1(){InitializeComponent();}bool IsRun false;private string path Directory.GetCurrentDirectory() "\\古诗词.txt";private…

Vite+Vue3安装且自动按需引入Element Plus组件库

一&#xff0c;安装Element Plus npm install element-plus //node环境16二&#xff0c;安装插件 npm install unplugin-auto-import unplugin-vue-components -D三&#xff0c;配置vite.config.ts文件 //按需引入element-plus组件 import AutoImport from unplugin-auto-i…

Oracle基本语法

前言&#xff1a; 1.使用的数据库不同&#xff0c;所使用的语法也略有不同 2.SQL对大小写不敏感&#xff0c;无论大小写&#xff0c;sql自动转换为大写 3.用户名、表名、表空间名、文件路径......等需要用单引号将其包含 4.一般引号里面的内容需要大写 准备工作&#xff1a; &a…

0618_QT4

练习&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

性能工具之 JMeter 常用组件介绍(八)

文章目录 一、Jmeter命令行启动二、Jmeter脚本录制 一、Jmeter命令行启动 Jmeter有两种运行&#xff1a; 一种是采用的界面模式(GUI&#xff09;启动&#xff0c;会占用不少系统资源&#xff1b;另一种是命令行模式&#xff08;non-GUI&#xff09;执行&#xff0c;这样节约资…

《SelectDB 新一代日志存储分析平台解决方案》白皮书重磅发布|立即下载

随着信息技术的飞速进步&#xff0c;企业面临着前所未有的系统复杂性和数据挑战。在此背景下&#xff0c;日志数据成为了企业洞察系统内部状态、监控网络安全以及分析业务动态的宝贵资源&#xff0c;构建高效的日志存储与分析平台至关重要。 作为基于 Apache Doris 打造的现代…

使用 AST语法树分析与修改Javascript 代码

1、AST语法树简介 当编写代码分析工具、代码美化工具、网站逆向分析等场景时&#xff0c;通常需要使用AST语法树技术。 比如项目开发过程中常遇到的场景&#xff1a;某个公共函数名需要更改&#xff0c;但被很多文件多处代码调用&#xff0c;手工修改非常容易漏改、改错等&…

【漏洞复现】致远互联FE协作办公平台 ncsubjass SQL注入

0x01 产品简介 致远互联FE协作办公平台是一款为企业提供全方位协同办公解决方案的产品。它集成了多个功能模块&#xff0c;旨在帮助企业实现高效的团队协作、信息共享和文档管理。 0x02 漏洞概述 致远互联FE协作办公平台 ncsubjass.jsp接口处存在SQL注入漏洞,未经身份验证的…