当前位置: 首页 > news >正文

无法正确识别车牌(Python、OpenCv、Tesseract)

我正在尝试识别车牌,但出现了错误,例如错误/未读取字符

以下是每个步骤的可视化:

从颜色阈值+变形关闭获得遮罩

以绿色突出显示的车牌轮廓过滤器

将板轮廓粘贴到空白遮罩上

Tesseract OCR的预期结果

BP 1309 GD

但我得到的结果是

BP 1309 6D

我试着把轮廓切成3片

是的,它是有效的,但如果我在这个方法中插入差异图像,一些图像就无法识别,比如这个

字母N不可识别,但如果使用第一种方法,它会起作用

这是程序

import numpy as np
import pytesseract
import cv2
import ospytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
image_path = "data"for nama_file in sorted(os.listdir(image_path)):print(nama_file)# Load image, create blank mask, convert to HSV, define thresholds, color thresholdI = cv2.imread(os.path.join(image_path, nama_file))dim = (500, 120)I = cv2.resize(I, dim, interpolation = cv2.INTER_AREA)(thresh, image) = cv2.threshold(I, 127, 255, cv2.THRESH_BINARY)result = np.zeros(image.shape, dtype=np.uint8)result = 255 - resulthsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)lower = np.array([0,0,0])upper = np.array([179,100,130])mask = cv2.inRange(hsv, lower, upper)slices = []slices.append(result.copy())slices.append(result.copy())slices.append(result.copy())i = 0j = 0xs = []# Perform morph close and merge for 3-channel ROI extractionkernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=1)extract = cv2.merge([close,close,close])# Find contours, filter using contour area, and extract using Numpy slicingcnts = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if len(cnts) == 2 else cnts[1]boundingBoxes = [cv2.boundingRect(c) for c in cnts](cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b:b[1][0], reverse=False))for c in cnts:x,y,w,h = cv2.boundingRect(c)area = w * hras = format(w / h, '.2f')if h >= 40 and h <= 70 and w >= 10 and w <= 65 and float(ras) <= 1.3:cv2.rectangle(I, (x, y), (x + w, y + h), (36,255,12), 3)result[y:y+h, x:x+w] = extract[y:y+h, x:x+w]# Slicexs.append(x)if i > 0:if (xs[i] - xs[i-1]) > 63:j = j+1i = i + 1slices[j][y:y+h, x:x+w] = extract[y:y+h, x:x+w]# Split throw into Pytesseractj=0for s in slices:cv2.imshow('result', s)cv2.waitKey()if j != 1 :data = pytesseract.image_to_string(s, lang='eng',config='--psm 6 _char_whitelist=ABCDEFGHIJKLMNOPQRTUVWXYZ')else :data = pytesseract.image_to_string(s, lang='eng',config='--psm 6 _char_whitelist=1234567890')print(data)# Block throw into Pytesseractdata = pytesseract.image_to_string(result, lang='eng',config='--psm 6')print(data)cv2.imshow('image', I)cv2.imshow('close', close)cv2.imshow('extract', extract)cv2.imshow('result', result)cv2.waitKey()

我尝试了很多方法,找到了一些解决方案:

应用扩张形态学操作使字母变薄:

# Split throw into Pytesseract
j=0
for s in slices:cv2.imshow('result', s)cv2.waitKey(1)if j != 1:data = pytesseract.image_to_string(s, config="-c tessedit""_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""  psm 6"" ")if data=='':            s = cv2.dilate(s, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)))cv2.imshow('cv2.dilate(s)', s)cv2.waitKey(1)data = pytesseract.image_to_string(s, config="-c tessedit""_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""  psm 6"" ")else:pytesseract.pytesseract.tessedit_char_whitelist = '1234567890'data = pytesseract.image_to_string(s, lang='eng',config=' psm 6 _char_whitelist=1234567890')print(data)

这种行为很奇怪。
有很多投诉,建议的解决方案不起作用

至少我学会了如何使用_char_whitelist选项(您需要添加-c tessedit

我认为该解决方案不够健壮(可能是偶然工作)。
我认为在当前版本的Tesseract中没有简单的解决方案

相关文章:

无法正确识别车牌(Python、OpenCv、Tesseract)

我正在尝试识别车牌&#xff0c;但出现了错误&#xff0c;例如错误/未读取字符 以下是每个步骤的可视化&#xff1a; 从颜色阈值变形关闭获得遮罩 以绿色突出显示的车牌轮廓过滤器 将板轮廓粘贴到空白遮罩上 Tesseract OCR的预期结果 BP 1309 GD 但我得到的结果是 BP 1309…...

VSCODE[配置ssh免密远程登录]

配置ssh免密远程登录 本文摘录于&#xff1a;https://blog.csdn.net/qq_44571245/article/details/123031276只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 这里要注意如下几个地方: 1.要进入.ssh目录创建文件: 2.是拷贝带"ssh-…...

Multi-object navigation in real environments using hybrid policies 论文阅读

论文信息 题目&#xff1a;Multi-object navigation in real environments using hybrid policies 作者&#xff1a;Assem Sadek, Guillaume Bono 来源&#xff1a;CVPR 时间&#xff1a;2023 Abstract 机器人技术中的导航问题通常是通过 SLAM 和规划的结合来解决的。 最近…...

初始多线程

目录 认识线程 线程是什么&#xff1a; 线程与进程的区别 Java中的线程和操作系统线程的关系 创建线程 继承Thread类 实现Runnable接口 其他变形 Thread类及其常见方法 Thread的常见构造方法 Thread类的几个常见属性 Thread类常用的方法 启动一个线程-start() 中断…...

论坛项目day3|开发社区首页

在典型的基于层次结构的软件架构中&#xff0c;特别是在使用MVC&#xff08;模型-视图-控制器&#xff09;设计模式的情况下&#xff0c;Controller、Service、DAO&#xff08;数据访问对象&#xff09;和Entity通常扮演着不同的角色&#xff0c;并且它们之间有清晰定义的关系。…...

Server - 文字转语音 (Text to Speech) 的在线服务 TTSMaker

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132287193 TTSMaker 是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括英语、法语、德语、西班…...

Python学习笔记_基础篇_数据类型之字符串

一.基本数据类型 整数&#xff1a;int 字符串&#xff1a;str(注&#xff1a;\t等于一个tab键) 布尔值&#xff1a; bool 列表&#xff1a;list 列表用[] 元祖&#xff1a;tuple 元祖用&#xff08;&#xff09; 字典&#xff1a;dict 注&#xff1a;所有的数据类型都存在想对应…...

(二分查找) 11. 旋转数组的最小数字 ——【Leetcode每日一题】

❓剑指 Offer 11. 旋转数组的最小数字 难度&#xff1a;简单 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers &#xff0c;它原来是一个升序排列的数组&#xff0c;并按上述情形进行了一次旋转…...

docker 制作tomcat镜像

需要下载tomcat安装包和jdk安装包&#xff0c;我这边下载的jdk版本分别为&#xff08;jdk和tomcat版本需要对应上&#xff09; apache-tomcat-9.0.78.tar.gzjdk-8u381-linux-x64.tar.gz创建一个readme.txt空文件 readme.txt创建一个Dockerfile文件 # centos系统作为底层 FROM …...

年之年的选择,组装版

组件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 时间选择年 - 年 --> <template><div class"year-range-pick…...

英语词法——代词

代词是用来代替名词、起名词作用的短语、分句和句子的词。英语中代词根据其意义和作用可分为九类:人称代词、物主代词、反身代词、相互代词、指示代词、疑问代词、不定代词、关系代词和连接代词。 第一节 人称代词 一、人称代词的形式和用法 人称代词单数复数第一人称第二人…...

1475.商品折扣后的最终价格

文章目录 题目描述解题思路&#xff1a;方法一&#xff1a;通俗解法方法二&#xff1a;单调栈 leetcode原题链接 1475. 商品折扣后的最终价格 题目描述 给你一个数组 prices &#xff0c;其中 prices[i] 是商店里第 i 件商品的价格。 商店里正在进行促销活动&#xff0c;如果你…...

php、 go 语言怎么结合构建高性能高并发商城。

一、php、 go 语言怎么结合构建高性能高并发商城。 将PHP和Go语言结合起来构建高性能高并发的商城系统可以通过多种方法实现&#xff0c;以利用两种语言的优势。下面是一些可能的方法和策略&#xff1a; 1. **微服务架构&#xff1a;** 使用微服务架构&#xff0c;将系统拆分…...

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia 初环境与设备环境准备克隆模型代码部署 ChatGLM-6B完整代码 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#x…...

【数据分享】2001-2022年我国省市县镇四级的逐月最高气温数据(无需转发/Shp/Excel格式)

气象数据是在各项研究中都非常常用的数据&#xff01;之前我们分享过来自于国家青藏高原科学数据中心的1901-2022年1km分辨率的逐月平均气温栅格数据&#xff0c;以及基于该栅格数据处理的Shp和Excel格式的2001-2022年我国省市县镇四级的逐月平均气温数据&#xff08;可查看之前…...

线段树-模板-区间查询-区间修改

【模板】线段树 2 传送门&#xff1a;https://www.luogu.com.cn/problem/P3373 题单&#xff1a;https://www.luogu.com.cn/training/16376#problems 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面三种操作&#xff1a; 将某区间每一个数乘上 x x x&a…...

微服务架构和分布式架构的区别

微服务架构和分布式架构的区别 有&#xff1a;1、含义不同&#xff1b;2、概念层面不同&#xff1b;3、解决问题不同&#xff1b;4、部署方式不同&#xff1b;5、耦合度不同。其中&#xff0c;含义不同指微服务架构是一种将一个单一应用程序开发为一组小型服务的方法&#xff…...

Ajax-概念、Http协议、Ajax请求及其常见问题

Ajax Ajax概念Ajax优缺点HTTP协议请求报文响应报文 Ajax案例准备工作express基本使用创建一个服务器 发送AJAX请求GET请求POST请求JSON响应 Ajax请求出现的问题IE缓存问题Ajax请求超时与网络异常处理Ajax手动取消请求Ajax重复发送请求问题 Ajax概念 AJAX 全称为Asynchronous J…...

react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作

目录 react 09之状态管理工具1 redux react-thunk的使用实现跨组件状态管理与异步操作store / index.js store的入口文件index.js 在项目入口文件 引入store / actionType.js 定义action的唯一标识store / reducers / index.jsstore / actions / form.jsstore / reducers / for…...

opencv实战项目 手势识别-实现尺寸缩放效果

手势识别系列文章目录 手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...