Python Opencv实战之文字检测OCR

目录
  • 1.相关函数的讲解
  • 2.代码展示
    • Detecting Words
    • Detecting ONLY Digits
  • 3.问题叙述
  • 4.image_to_data()配置讲解
  • 5.项目拓展
  • 6.总结与评价

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识别错误。

以上就是Python Opencv实战之文字检测OCR的详细内容,更多关于Python Opencv文字检测的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python 图片文字识别的实现之PaddleOCR

    目录 项目使用 项目结构 环境部署 1.安装Anaconda,构造虚拟环境 2.依赖包下载 测试代码 参数补充 总结 前言 什么是OCR? 光学字符识别(Optical Character Recognition, OCR),是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程.简而言之,检测图像中的文本资料,并且识别出文本的内容. 那么有哪些应用场景呢? 其实我们日常生活中处处都有ocr的影子,比如在疫情期间身份证识别录入信息.车辆车牌号识别.自动驾驶等.我们的生活中,机器学习已

  • Python+opencv 实现图片文字的分割的方法示例

    实现步骤: 1.通过水平投影对图形进行水平分割,获取每一行的图像: 2.通过垂直投影对分割的每一行图像进行垂直分割,最终确定每一个字符的坐标位置,分割出每一个字符: 先简单介绍一下投影法:分别在水平和垂直方向对预处理(二值化)的图像某一种像素进行统计,对于二值化图像非黑即白,我们通过对其中的白点或者黑点进行统计,根据统计结果就可以判断出每一行的上下边界以及每一列的左右边界,从而实现分割的目的. 下面通过Python+opencv来实现该功能 首先来实现水平投影: import cv2 impor

  • python中opencv实现文字分割的实践

    图片文字分割的时候,常用的方法有两种.一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像:还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像. 投影法 对文字图片作横向和纵向投影,即通过统计出每一行像素个数,和每一列像素个数,来分割文字. 分别在水平和垂直方向对预处理(二值化)的图像某一种像素进行统计,对于二值化图像非黑即白,我们通过对其中的白点或者黑点进行统计,根据统计结果就可以判断出每一行的上下边界以及每一列的左右边界,从而实现分割的目的. 算法步骤: 使用水平投影和垂直投

  • 基于Python实现图像文字识别OCR工具

    目录 引言 功能列表 OCR部分 界面部分 软件代码 参考链接 引言 最近在技术交流群里聊到一个关于图像文字识别的需求,在工作.生活中常常会用到,比如票据.漫画.扫描件.照片的文本提取. 博主基于 PyQt + PaddleOCR 写了一个桌面端的OCR工具,用于快速实现图片中文本区域自动检测+文本自动识别. 识别效果如下图所示: 所有框选区域为OCR算法自动检测,右侧列表有每个框对应的文字内容: 点击右侧"识别结果"中的文本记录,然后点击"复制到剪贴板"即可复制该

  • 小白学Python之实现OCR识别

    目录 前期准备 界面编写 截图功能实现 OCR实现 内容显示 总结 前期准备 在这个阶段主要准备整个小程序的结构,既然要实现ocr,那么输入就是一张图片,而图片这里采用屏幕截图的方式获得,输出是文字,这里采用搜狗的ocr接口,我们把截好的图片传到搜狗ocr接口中,然后把返回的文字作为输出即可. 由于想做一个小程序,所以要为程序做GUI,这里采用tkinter编制GUI界面. 界面编写 界面主要就准备一个窗体,里面有菜单,给出OCR功能. 之后我们点击菜单,则启动一个截图功能,在截图完成后,我们就

  • Python Opencv实战之文字检测OCR

    目录 1.相关函数的讲解 2.代码展示 Detecting Words Detecting ONLY Digits 3.问题叙述 4.image_to_data()配置讲解 5.项目拓展 6.总结与评价 1.相关函数的讲解 image_to_data()的输出结果是表格形式,输出变量的类型依旧是字符串. 你会得到一个这样的列表['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', '

  • Python+OpenCV实战之实现文档扫描

    目录 1.效果展示 2.项目准备 3.代码的讲解与展示 4.项目资源 5.项目总结与评价 1.效果展示 网络摄像头扫描: 图片扫描: 最终扫描保存的图片: (视频) (图片) 2.项目准备 今天的项目文件只需要两个.py文件,其中一个.py文件是已经写好的函数,你将直接使用它,我不会在此多做讲解,因为我们将会在主要的.py文件import 导入它,如果想了解其中函数是如何写的,请自行学习. utlis.py,需要添加的.py文件 import cv2 import numpy as np # T

  • Python+Opencv实战之人脸追踪详解

    目录 前言 人脸追踪技术简介 使用基于 dlib DCF 的跟踪器进行人脸跟踪 使用基于 dlib DCF 的跟踪器进行对象跟踪 小结 前言 人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份.意图和情感:而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用.由于外观变化.遮挡.快速运动.运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性. 人脸追踪技术简介 基于判别相关滤波器 (d

  • python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)

    一.利用直方图的方式进行批量的图片缺陷检测(方法简单) 二.步骤(完整代码见最后) 2.1灰度转换(将原图和要检测对比的图分开灰度化) 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比较 img = cv2.imread("0.bmp") #原图灰度转换 gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) #循环要检测的图,均灰度化 for i in range(1, 6): t1=cv2.cvtColor(cv2.imread

  • Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例. 环境:python3.7 opencv4.4.0 二 背景前景分离 1 灰度+二值+形态学 轮廓特征和联通组件 根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割. 1

  • 树莓派上利用python+opencv+dlib实现嘴唇检测的实现

    目录 1.安装相关库文件 2.代码部分 3.实验效果 树莓派上利用python+opencv+dlib实现嘴唇检测 项目的目标是在树莓派上运行python代码以实现嘴唇检测,本来以为树莓派的硬件是可以流畅运行实时检测的,但是实验的效果表明树莓派实时检测是不可行,后面还需要改进. 实验的效果如下: 1.安装相关库文件 这里需要用的库有opencv,numpy,dlib. 1.1 安装opencv pip3 install opencv-python 1.2 安装numpy 树莓派中自带了numpy

  • Python OpenCV实战之与机器学习的碰撞

    目录 0. 前言 1. 机器学习简介 1.1 监督学习 1.2 无监督学习 1.3 半监督学习 2. K均值 (K-Means) 聚类 2.1 K-Means 聚类示例 3. K最近邻 3.1 K最近邻示例 4. 支持向量机 4.1 支持向量机示例 小结 0. 前言 机器学习是人工智能的子集,它为计算机以及其它具有计算能力的系统提供自动预测或决策的能力,诸如虚拟助理.车牌识别系统.智能推荐系统等机器学习应用程序给我们的日常生活带来了便捷的体验.机器学习的蓬勃发展,得益于以下三个关键因素:1) 海

  • Python+OpenCV实战之利用 K-Means 聚类进行色彩量化

    目录 前言 利用 K-Means 聚类进行色彩量化 完整代码 显示色彩量化后的色彩分布 前言 K-Means 聚类算法的目标是将 n 个样本划分(聚类)为 K 个簇,在博文<OpenCV与机器学习的碰撞>中,我们已经学习利用 OpenCV 提供了 cv2.kmeans() 函数实现 K-Means 聚类算法,该算法通过找到簇的中心并将输入样本分组到簇周围,同时通过简单的示例了解了 K-Means 算法的用法.在本文中,我们将学习如何利用 K-Means 聚类进行色彩量化,以减少图像中颜色数量.

  • C++ OpenCV实战之车道检测

    目录 前言 一.获取车道ROI区域 二.车道检测 1.灰度.阈值 2.获取非零像素点 3.绘制车道线 总结 前言 本文将使用OpenCV C++ 进行车道检测. 一.获取车道ROI区域 原图如图所示. 使用下面代码段获取ROI区域.该ROI区域点集根据图像特征自己设定.通过fillPoly填充ROI区域,最终通过copyTo在原图中扣出ROI. void GetROI(Mat src, Mat &image) {     Mat mask = Mat::zeros(src.size(), src

  • C++ OpenCV实战之标记点检测的实现

    在实际应用中,能够直接利用霍夫圆检测这些理想方法的应用场景是非常少的,更多的是利用拟合的办法去寻找圆形. 大致思路如下,首先先选择要处理的ROI部分,记录下该图的左上点在原图的坐标,如果原图过大,要先进行等比例缩放:然后利用自适应阈值和Canny边缘提取进行处理,再进行闭运算与轮廓检测,计算点集面积,通过筛选面积阈值去除杂点,最后进行轮廓检测,拟合椭圆,效果如下: 1.导入原图: 2.截取ROI 3.进行自适应阈值化与Canny边缘提取 4.进行闭运算,然后轮廓检测,然后计算点集面积,通过面积阈

随机推荐