Tesseract用OpenCV进行文本检测

我没有混日子,只是辛苦的时候没人看到罢了

一、什么是Tesseract

  • Tesseract是一个开源的OCR(Optical Character Recognition)引擎,OCR是一种技术,它可以识别和解析图像中的文本内容,使计算机能够理解并处理这些文本。
  • Tesseract提供了丰富的配置选项和接口,使得开发者可以根据自己的需求和场景进行定制化和集成。
  • 通过使用Tesseract,你可以将一张包含文字的图像(如扫描文档、照片或截屏)输入到引擎中,然后Tesseract会通过一系列的图像处理和模式识别技术来提取出图像中的文本信息。它将识别出的文本转换为可以被计算机编辑和搜索的文本内容。

简单来说,Tesseract是一个强大的OCR引擎,适用于将图像中的文字提取出来,并将其转换为计算机可处理的文本形式。它在许多领域和应用中被广泛使用,如扫描和数字化文档、自动化数据输入、图书馆和档案管理等。

传送门

二、创建开发环境

使用conda创建一个名字为openCV的开发环境

conda create -n openCV

 引入openCV包

pip install opencv-python

 引入pytesseract包

三、代码实战

检测图片中的字符串并打印

先准备一张如下格式的图片

编写代码解析

testDectection.py

import cv2
import pytesseractimg = cv2.imread('1.png')  # 使用opencv将图片读进来
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图片的颜色通道格式由BGR转化成pytesseract能识别的RGB格式
print(pytesseract.image_to_string(img))  # 调用pytesseract引擎将图片中的内容输出出来
cv2.imshow('result', img)  # 显示
cv2.waitKey(0)

 输出

以上就是通过使用pytesseract简单获取图像原始信息的方法。 

检测图中的字符并用红框标注

代码

import cv2
import pytesseractimg = cv2.imread('1.png')  # 使用opencv将图片读进来
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图片的颜色通道格式由BGR转化成pytesseract能识别的RGB格式# Detecting Characters
hImg, wImg, _ = img.shape  # 找出图片的宽度和高度
boxes = pytesseract.image_to_boxes(img)  # 使用pytesseract找出图片中字符的坐标位置
for c in boxes.splitlines():c = c.split(' ')print(c)x, y, w, h = int(c[1]), int(c[2]), int(c[3]), int(c[4])cv2.rectangle(img, (x, hImg - y), (w, hImg - h), (0, 0, 255), 3)    # 使用opencv画框框,使用红色,厚度为3cv2.imshow('result', img)  # 显示
cv2.waitKey(0)

输入两张图片

1.png

 2.png

输出

每一个检测出来字符串的坐标

图像中添加识别的文本内容

import cv2
import pytesseractimg = cv2.imread('1.png')  # 使用opencv将图片读进来
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图片的颜色通道格式由BGR转化成pytesseract能识别的RGB格式# Detecting Characters
hImg, wImg, _ = img.shape  # 找出图片的宽度和高度
boxes = pytesseract.image_to_boxes(img)  # 使用pytesseract找出图片中字符的坐标位置
for c in boxes.splitlines():c = c.split(' ')print(c)x, y, w, h = int(c[1]), int(c[2]), int(c[3]), int(c[4])cv2.rectangle(img, (x, hImg - y), (w, hImg - h), (0, 0, 255), 3)  # 使用opencv画框框,使用红色,厚度为3cv2.putText(img, c[0], (x, hImg - y + 25), cv2.FONT_HERSHEY_COMPLEX, 1, (50, 50, 255), 2)   # 向图像中添加文本cv2.imshow('result', img)  # 显示
cv2.waitKey(0)

 关键

cv2.putText(img, c[0], (x, hImg - y + 25), cv2.FONT_HERSHEY_COMPLEX, 1, (50, 50, 255), 2)

这行代码使用OpenCV库中的putText函数向图像中添加文本。

解释如下:

  • img:表示要添加文本的图像。
  • c[0]:表示要添加的文本内容,c[0]可能是一个字符串变量,用于指定要添加的文本。
  • (x, hImg - y + 25):表示文本的起始位置,该位置是一个元组(x, y),其中x表示文本的横坐标,hImg - y + 25表示文本的纵坐标。hImg可能是整个图像的高度,y是用于定位白色文本的轮廓的顶端位置的变量。通过hImg - y + 25可以使文本出现在轮廓下方一些距离的位置。
  • cv2.FONT_HERSHEY_COMPLEX:表示所使用的字体类型,这里使用的是复杂的字体类型。
  • 1:表示文本的字体缩放因子,1表示原始大小。
  • (50, 50, 255):表示文本的颜色,该颜色为一个元组(B, G, R),其中BGR分别表示蓝色、绿色、红色通道的值。在这个例子中,文本颜色是一种深红色。
  • 2:表示文本的线宽,即文本边框的宽度。这里设置为2,使得文本边框较粗。

输出

检测连续的字符串

实际中一般不关注一个字符,更多是关注连起来的字符串

import cv2
import pytesseractimg = cv2.imread('1.png')  # 使用opencv将图片读进来
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图片的颜色通道格式由BGR转化成pytesseract能识别的RGB格式# Detecting Characters
hImg, wImg, _ = img.shape  # 找出图片的宽度和高度
boxes = pytesseract.image_to_data(img)  # 使用pytesseract找出图片中字符的坐标位置
for x, c in enumerate(boxes.splitlines()):if x != 0:c = c.split()print(c)if len(c) == 12:x, y, w, h = int(c[6]), int(c[7]), int(c[8]), int(c[9])cv2.rectangle(img, (x, y), (x + w, h + y), (0, 0, 255), 3)  # 使用opencv画框框,使用红色,厚度为3cv2.putText(img, c[11], (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (50, 50, 255), 2)  # 向图像中添加文本cv2.imshow('result', img)  # 显示
cv2.waitKey(0)

 输出

每个字段的含义:

  • level:代表文本在页面中的级别。这里的级别是从1开始的,表示文本的嵌套层级。
  • page_num:代表文本所在的页码。在多页文档中,每一页都有一个唯一的页码。
  • block_num:代表文本所在的文本块的编号。文本块是文档中的一个矩形区域,包含多个段落或行。
  • par_num:代表文本所在的段落的编号。段落是文档中的一个文本段落,通常由一组相关的句子组成。
  • line_num:代表文本所在行的编号。行通常是段落中的一个文本行。
  • word_num:代表文本所在单词的编号。单词是文本的最小单位,通常由一个或多个字符组成。
  • left:代表文本区域的左边界相对于页面的位置。
  • top:代表文本区域的上边界相对于页面的位置。
  • width:代表文本区域的宽度。
  • height:代表文本区域的高度。
  • conf:代表文本的置信度,通常在0到100之间。置信度表示OCR算法对所识别文本的可信程度。
  • text:代表识别出的文本内容。

只识别图片中的数字

import cv2
import pytesseractimg = cv2.imread('1.png')  # 使用opencv将图片读进来
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图片的颜色通道格式由BGR转化成pytesseract能识别的RGB格式# Detecting Characters
hImg, wImg, _ = img.shape  # 找出图片的宽度和高度
cong = r'--oem 3 --psm 6 outputbase digits'
boxes = pytesseract.image_to_data(img, config=cong)  # 使用pytesseract找出图片中字符的坐标位置
for x, c in enumerate(boxes.splitlines()):if x != 0:c = c.split()print(c)if len(c) == 12:x, y, w, h = int(c[6]), int(c[7]), int(c[8]), int(c[9])cv2.rectangle(img, (x, y), (x + w, h + y), (0, 0, 255), 3)  # 使用opencv画框框,使用红色,厚度为3cv2.putText(img, c[11], (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (50, 50, 255), 2)  # 向图像中添加文本cv2.imshow('result', img)  # 显示
cv2.waitKey(0)

 重点

cong = r'--oem 3 --psm 6 outputbase digits'
boxes = pytesseract.image_to_data(img, config=cong)

参数解释:

  • oem是一个参数,用于指定OCR引擎的OCR引擎模式(OCR Engine Mode)。OCR引擎模式控制Tesseract在文本识别过程中的行为和算法。
  • psm是一种页分割模式(Page Segmentation Mode),用于指定OCR引擎在识别文本时如何处理页面布局和分割问题。psm参数控制Tesseract在识别文本时如何将图像分割为单个字符、单词、行和文本块。

 

 

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

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

相关文章

【LeetCode】617.合并二叉树

题目 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠…

k8s常用资源管理 控制

目录 Pod(容器组):Pod是Kubernetes中最小的部署单元,可以包含一个或多个容器。Pod提供了一种逻辑上的封装,使得容器可以一起共享网络和存储资源 1、创建一个pod 2、pod管理 pod操作 目录 创建Pod会很慢 Pod&…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C) Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…

【图像去噪的滤波器】非局部均值滤波器的实现,用于鲁棒的图像去噪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【C语言】每日一题(错误的集合)

最近在牛客、力扣上做题,花费海量时间,苦不堪言,有时绞尽脑汁也想不出,痛定思痛,每日记录写的比较困难的题。 错误的集合 题目如上图所示 题主乍看之下觉得很简单,再看例子,不就是一个有序数组…

接口测试之Jmeter+Ant+Jenkins接口自动化测试平台

平台简介 一个完整的接口自动化测试平台需要支持接口的自动执行,自动生成测试报告,以及持续集成。Jmeter支持接口的测试,Ant支持自动构建,而Jenkins支持持续集成,所以三者组合在一起可以构成一个功能完善的接口自动化…

变形金刚在图像识别方面比CNN更好吗?

链接到文 — https://arxiv.org/pdf/2010.11929.pdf 一、说明 如今,在自然语言处理(NLP)任务中,转换器已成为goto架构(例如BERT,GPT-3等)。另一方面,变压器在计算机视觉任务中的使用…

Linux安装JDK

1、到Oracle官网下载JDK https://www.oracle.com/java/technologies/downloads/#java8 Oracle账号可以网上搜或者自己注册一个,JDK安装包根据Linux版本自行选择,我的Linux系统是64位的,所以我这里选择的是x64的JDK安装包 2、下载完后把JDK上…

4.0 Spring Boot入门

1. Spring Boot概述 Spring Boot介绍 Spring Boot是Pivotal团队在2014年推出的全新框架,主要用于简化Spring项目的开发过程,可以使用最少的配置快速创建Spring项目。 Spring Boot版本 2014年4月v1.0.0.RELEASE发布。 ​ 2.Spring Boot特性 约定优于配…

第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)

deque插入和删除 功能描述: 向deque容器中插入和删除数据 函数原型: 两端插入操作: push_back(elem); //在容器尾部添加一个数据 push_front(elem); //在容器头部插入一个数据 pop_back(); //删除容器最后一个数据 pop_front(); //删除容器…

Patch SCN一键解决ORA-600 2662故障---惜分飞

客户强制重启库之后,数据库启动报ORA-600 2037,ORA-745 kcbs_reset_pool/kcbzre1等错误 Wed Aug 09 13:25:38 2023 alter database mount exclusive Successful mount of redo thread 1, with mount id 1672229586 Database mounted in Exclusive Mode Lost write protection d…

0基础学C#笔记10:归并排序法

文章目录 前言一、递归的方式二、代码总结 前言 将一个大的无序数组有序,我们可以把大的数组分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一个有序的数组。由于两个小的数组都是有序的,所以在合并的时候是很…