Opencv学习项目2——pytesseract

上一次我们使用pytesseract.image_to_boxes来检测字符,今天我们使用pytesseract.image_to_data来检测文本并显示

实战教程

和上一次一样,添加opencv-python和pytesseract库

首先我们先来了解一下pytesseract.image_to_data

**pytesseract.image_to_data(img)**是一个 pytesseract 库提供的函数,用于检测图像中的文本,并返回详细的文本框、文本内容及其位置信息。这个函数会返回一个包含每个检测到的文本块信息的字典列表。

每个字典包含以下信息:

  • level: 检测级别(如字块、段落等)
  • page_num: 页码
  • block_num: 块编号
  • par_num: 段落编号
  • line_num: 行号
  • word_num: 单词编号
  • left: 文本框左边缘的 x 坐标
  • top: 文本框顶部的 y 坐标
  • width: 文本框的宽度
  • height: 文本框的高度
  • conf: 文本识别的置信度
  • text: 检测到的文本内容

接一下我们使用代码打印一下pytesseract.image_to_data

复制代码
import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

# 读取图像
img = cv2.imread('3.jpg')
# 将图像从 BGR 格式转换为 RGB 格式(因为 pytesseract 使用 RGB 格式)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

himg, wimg, _ = img.shape
data = pytesseract.image_to_data(img)
print(data)

# 显示带有文本框和识别结果的图像
cv2.imshow( 'result', img)
# 等待按键输入来关闭窗口
cv2.waitKey(0)
# 关闭所有打开的窗口
cv2.destroyAllWindows()

运行后我们得到这一串,按我刚才介绍的 pytesseract.image_to_data可知各个数字的含义,大家可以对照着看一下

接下来我们使用for x, b in enumerate(data.splitlines()):来遍历并枚举文本数据中的每一行

复制代码
for x,b in enumerate(data.splitlines()):
     if x!=0:
        b = b.split()
        print(b)

这样就将坐标和文本分离出来了

'5' '1' '1' '1' '4' '1' '81' '436' '535' '77' '96.205406' 'EVERYONE.'

从左往右为层级页码、块编号、段落编号、 行号、单词编号、文本框左边缘的 x 坐标、文本框顶部的 y 坐标、文本框的宽度、文本框的高度、文本识别的置信度、检测到的文本内容

接下来我们采用cv2的画矩形来画框,在这里我又发现 pytesseract.image_to_data 的原点和opencv的原点又是同一个原点了,和之前的pytesseract.image_to_boxes不同

这样我们就可以写出代码

复制代码
import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

# 读取图像
img = cv2.imread('3.jpg')
# 将图像从 BGR 格式转换为 RGB 格式(因为 pytesseract 使用 RGB 格式)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

himg, wimg, _ = img.shape
data = pytesseract.image_to_data(img)
print(data)
for x,b in enumerate(data.splitlines()):
     if x!=0:
        b = b.split()
        print(b)
        if (len(b)==12):
            x,y,w,h = int(b[6]),int(b[7]),int(b[8]),int(b[9])
            cv2.rectangle(img,(x,y),(w+x,h+y),(0,0,255),3)
            cv2.putText(img,b[11],(x+20,y-5),cv2.FONT_HERSHEY_COMPLEX,1,(50,50,255),2)


# 显示带有文本框和识别结果的图像
cv2.imshow( 'result', img)
# 等待按键输入来关闭窗口
cv2.waitKey(0)
# 关闭所有打开的窗口
cv2.destroyAllWindows()

这里我们使用判断每一行是否有12个数据来筛选出我们需要的文本那一行

这样就完成了,我们看一下效果

我们发现文本被正确框出和显示出来 。

有兴趣的可以关注一下,近期一直更新,谢谢

相关推荐
失散137 分钟前
自然语言处理——04 注意力机制
人工智能·自然语言处理·注意力机制·seq2seq 架构
Freak嵌入式23 分钟前
一文速通 Python 并行计算:教程总结
开发语言·python
MiaoChuAI40 分钟前
豆包AI PPT与秒出PPT对比评测:谁更适合你?
人工智能·powerpoint
hweiyu0040 分钟前
Python办公之Excel(openpyxl)、PPT(python-pptx)、Word(python-docx)
python·powerpoint·excel
java技术之路1 小时前
【免费AI文档助手开发实战系列】基于正则表达式的PDF脱敏python服务构建(一)
python·pdf·pymupdf·免费pdf脱敏
waynaqua1 小时前
FastAPI开发AI应用五:模型新增图片理解
python·openai·fastapi
waynaqua1 小时前
FastAPI开发AI应用四:新增豆包、kimi模型
python·fastapi·ai编程
%KT%1 小时前
简单聊聊多模态大语言模型MLLM
人工智能·语言模型·自然语言处理
唐某人丶1 小时前
教你如何用 JS 实现一个 Agent 系统(1)—— 认识 Agentic System
前端·人工智能
泡泡茶壶_ovo1 小时前
RORPCAP: retrieval-based objects and relations prompt for image captioning
人工智能·深度学习·计算机视觉·语言模型·prompt·多模态·imagecaptioning