Python Opencv实战之文字检测OCR
作者:夏天是冰红茶 发布时间:2023-03-18 14:05:41
1.相关函数的讲解
image_to_data()的输出结果是表格形式,输出变量的类型依旧是字符串。
你会得到一个这样的列表['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'],我们逐个解释下:
level,当前项的层级;
page_num,当前项所属页,一般情况下,单张图片的内容均会被分在同一个页;
block_num ,当前项所属块,Tesseract会将图像分割为多个不同的block,block会出现1,2,3……等等值;
par_num,当前图像中文字的段落分类;
line_num,当前项所属行;
word_num,为同一行中当前项所属的单词序号;
left\ top\ width\ height,分别为当前项所在矩形区域的左上角坐标、宽度和高度;
conf,当前检测字符的置信度,表示项无文字,值为-1,若Tesseract认为当前区域有文字,则其值得范围为0~100;
text,即为当前项的文本,若无文字此项为空。
那么关于enumerate()函数,大家可以看看此文。
详解Python中enumerate函数的使用
2.代码展示
Detecting Words
import cv2
import pytesseract
import numpy as np
from PIL import ImageGrab
import time
pytesseract.pytesseract.tesseract_cmd = 'E:\pythonProject\Github\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('1.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
##############################################
##### Detecting Words ######
##############################################
#[ 0 1 2 3 4 5 6 7 8 9 10 11 ]
#['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text']
boxes = pytesseract.image_to_data(img)
for a,b in enumerate(boxes.splitlines()):
print(b)
if a!=0:
b = b.split()
if len(b)==12:
x,y,w,h = int(b[6]),int(b[7]),int(b[8]),int(b[9])
cv2.putText(img,b[11],(x,y-5),cv2.FONT_HERSHEY_SIMPLEX,1,(50,50,255),2)
cv2.rectangle(img, (x,y), (x+w, y+h), (50, 50, 255), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
Detecting ONLY Digits
import cv2
import pytesseract
import numpy as np
from PIL import ImageGrab
import time
pytesseract.pytesseract.tesseract_cmd = 'E:\pythonProject\Github\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('1.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
##############################################
##### Detecting ONLY Digits ######
##############################################
hImg, wImg,_ = img.shape
conf = r'--oem 3 --psm 6 outputbase digits'
boxes = pytesseract.image_to_boxes(img,config=conf)
for b in boxes.splitlines():
print(b)
b = b.split(' ')
print(b)
x, y, w, h = int(b[1]), int(b[2]), int(b[3]), int(b[4])
cv2.rectangle(img, (x,hImg- y), (w,hImg- h), (50, 50, 255), 2)
cv2.putText(img,b[0],(x,hImg- y+25),cv2.FONT_HERSHEY_SIMPLEX,1,(50,50,255),2)
cv2.imshow('img', img)
cv2.waitKey(0)
3.问题叙述
首先,我遇到的问题有
(1)无效的TeserAct版本:“TeserAct3.02”
可能是此版本太低了,但我找了找新的版本,在此更新一下路径:
点击此网址 Home · UB-Mannheim/tesseract Wiki · GitHub
自行选择合适的就可以了。
(2)识别效果差
可以看到,将本来不是数字的字母也强行识别出来了,这简直说不过去了。
最后我们看看更改后的效果:
cool,非常的棒,快去试试吧!
对于数字又强差人意了,所以说它这个本身还是存在一点的问题。我觉得影响不大,你觉得不舒服,可以换张图试试。
4.image_to_data()配置讲解
oem讲解
OEM _ TESSERACТ_ ONLY 只以最快的速度运行Tesseract
OEM _ CUBE _ ONLY 仅运行多维数据集-精度更高,但速度更慢
OEM _ TESSERACT _ CUBE _ cOMBINED 同时运行并组合结果-最佳精度
OEM _ DEFAULT 在调用init_*0时指定此模式,以指示应根据特定于语言的配置中的变量自动推断上述任何模式。命令行配置,或者如果没有在上面任何一项中指定,则应设置为默认的OEM_ TESSERACT_ ONLY。
psm讲解
PSM _ OSD _ ONLY 仅用于方向和脚本检测。
PSM _ AUTO _ OSD 带有方向和脚本检测的自动页面分割。(OSD)
PSM _ AUTO _ ONLY 自动页面分割,但没有OSD或OCR。 PSM _ AUTO 完全自动页面分割,但没有OSD。
PSM _ SINGLE _ COLUMN 假设一列大小可变的文本。
PSM _ SINGLE _ BLOCK _ VERT _ TEXT 假设一个统一的垂直对齐文本块。
PSM _ SINGLE _ BLOCK 假设一个统一的文本块(默认值)
PSM _ SINGLE _ LINE 将图像视为单个文本行。
PSM _ SINGLE _ WORD 将图像视为单个单词。
PSM _ CIRCLE _ WORD 将图像视为圆圈中的单个单词。
PSM _ SINGLE _ CHAR 将图像视为单个字符。
PSM _ SPARSE _ TEXT 在没有特定顺序的情况下尽可能多地查找文本。
PSM _ SPARSE _ TEXT _ OSD 具有方向和脚本检测的稀疏文本。
PSM _ RAW _ LINE 将图像视为单个文本行,绕过特定于Tesseract的黑客攻击。
5.项目拓展
import cv2
import pytesseract
import numpy as np
from PIL import ImageGrab
import time
pytesseract.pytesseract.tesseract_cmd = 'E:\pythonProject\Github\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('1.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cap = cv2.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)
def captureScreen(bbox=(300,300,1500,1000)):
capScr = np.array(ImageGrab.grab(bbox))
capScr = cv2.cvtColor(capScr, cv2.COLOR_RGB2BGR)
return capScr
while True:
timer = cv2.getTickCount()
_,img = cap.read()
#img = captureScreen()
#DETECTING CHARACTERES
hImg, wImg,_ = img.shape
boxes = pytesseract.image_to_boxes(img)
for b in boxes.splitlines():
#print(b)
b = b.split(' ')
#print(b)
x, y, w, h = int(b[1]), int(b[2]), int(b[3]), int(b[4])
cv2.rectangle(img, (x,hImg- y), (w,hImg- h), (50, 50, 255), 2)
cv2.putText(img,b[0],(x,hImg- y+25),cv2.FONT_HERSHEY_SIMPLEX,1,(50,50,255),2)
fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
#cv2.putText(img, str(int(fps)), (75, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (20,230,20), 2);
cv2.imshow("Result",img)
cv2.waitKey(1)
cv2.imshow('img', img)
cv2.waitKey(0)
进行网络摄像头的实时文字测试。
6.总结与评价
我是首次使用Tesseract,体验感很不好,这是我在b站的评论中看到的:
说实话,我还没有学到用算法的地步,学学了解一下就好了,反正我是准备项目实战的中后期去学习深度学习,以及其他的算法学习,这方面我不好说,但它的精度的确是不达标,你们也看到了,居然把文字也识别成了数字。而且开启摄像头识别的也不是很好,识别不完全or识别错误。
来源:https://blog.csdn.net/m0_62919535/article/details/126589521


猜你喜欢
- UTF-8匹配: 在javascript中,要判断字符串是中文是很简单的。比如: var str = "php编程";
- 修复Access数据库,我们一般使用微软Office 97中带的Access 97对数据库进行修复和整理。Access数据库被损坏分以下几种
- 目录1. threding模块创建线程对象2. threding模块创建多线程3. 多线程的参数传递4. 线程产生的资源竞争1. thred
- 这篇文章主要介绍了Python多线程获取返回值代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 最近导师让我跑模型,生物信息方向的,我一个学计算机的,好多东西都看不明白。现在的方向大致是,用深度学习的模型预测病毒感染人类的风险。既然是病
- 案例故事:百度网盘非会员大量上传文件,会弹出:“上传文件数量超出500个现在,开通超级会员后可继续上传”,其实是限制拖入500张相片,并非限
- 这个是JS控制图片滚动的效果,当鼠标结果新闻标题时开始滚动到对应的图片,可以作为图片新闻。效果图:<!DOCTYPE HTML PUB
- 分享一下 IntelliJ IDEA 2021.1 的激活破解教程,相当于永久激活了,亲测有效,下面是详细文档哦~申明:本教程 Intell
- 滑动窗口算法是一种可以高效解决数组问题的算法。它通过维护一个固定大小的滑动窗口,来快速计算某些数组的相关指标或者求解一些特定的问题。这种算法
- python作为脚本性语言,加上它的简便易用性。会经常当作脚本用来处理一下数据和格式。其中处理文件就是频繁用处之一。简单编写几个常用的xls
- python pandas分组聚合1、环境python3.9win10 64bitpandas==1.2.1groupby方法是pandas
- 例如我要测试一个创建网络的接口,需要先拿token值,而获取token的接口请求成功后,将token存在了响应头headers,postma
- 目录1.使用说明2.准备3.语法3.1 变量及赋值3.2 入参出参3.3 流程控制-判断3.4 流程控制-循环3.5 流程控制-退出、继续循
- 到了今天,数据库已经成了网站的灵魂,可以说,没有对数据进行集中管理就算不上是一个真正的网站。而ASP加数据库,更成了主流中的主流,网站里的用
- 最近使用Python 3.5写了一个GUI小程序,于是想将该写好的程序发布成一个exe文件,供自己单独使用。至于通过安装的方式使用该程序,我
- 正在看的ORACLE教程是:PL/SQL实现Oracle数据库任务调度。摘要:本文主要就数据库恢复与系统任务的调度,在结合一般性的数据库后台
- 关于在windows下安装mysql 5.7•要注意的新坑:5.7版本安装后ROOT账号是有默认的密码的,这个密码在windows下可以在m
- 本文实例讲述了Python使用sklearn库实现的各种分类算法简单应用。分享给大家供大家参考,具体如下:KNNfrom sklearn.n
- 有一个古老的争论,是关于在哪里存储应用程序业务逻辑的:是在应用程序本身的业务逻辑层中还是在数据库层中。应用程序逻辑层的绝对支持者提出,数据库
- 制作爬虫的步骤制作一个爬虫一般分以下几个步骤:分析需求分析网页源代码,配合开发者工具编写正则表达式或者XPath表达式正式编写 python