最近开始学习opencv使用,跟着b站一起做实战项目,跟大家分享一下学习成果,大佬勿喷
项目演示
pytesseract 是一个用于文字识别(OCR,光学字符识别)的 Python 库,它是 Tesseract OCR 引擎的 Python 封装。
-
功能:
- 文字识别:pytesseract 可以将图像中的文字转换为文本。它支持多种语言和文字的识别。
- 多平台支持:适用于 Windows、macOS 和 Linux 操作系统。
- 简单易用:提供简单的 API,方便在 Python 中集成和使用。
-
基于Tesseract OCR:
- Tesseract 是一个开源的OCR引擎,由 Google 开发和维护。它支持多种文件格式和语言,能够进行精确的文字识别。
- pytesseract 则为 Python 提供了便捷的接口,使开发者能够利用 Tesseract 的强大功能进行文字识别。
-
安装与配置:
- 安装:通常使用
pip install pytesseract
命令来安装。 - 配置:pytesseract 需要 Tesseract OCR 引擎的支持,因此在使用前需要先安装 Tesseract,并将其路径配置到 pytesseract 中,以便程序能够找到并调用 Tesseract。
- 安装:通常使用
-
使用方法:
- 简单的文字识别:使用
pytesseract.image_to_string()
方法进行基本的图像文字识别。 - 详细控制:通过
pytesseract.image_to_boxes()
、pytesseract.image_to_data()
等方法可以获取更详细的识别结果,如字符的位置、置信度等信息。
- 简单的文字识别:使用
-
适用场景:
- 文档数字化:将扫描的文档转换为可编辑的文本。
- 图像处理:处理包含文本的图像,提取关键信息。
- 自动化任务:在自动化流程中,从图像中提取所需的文字信息。
总体来说,pytesseract 是一个强大且广泛使用的 Python 库,为开发者提供了便捷的方式来实现图像中的文字识别功能。
实战教程
首先我们在Pycharm中新建一个项目,然后添加pytesseract库和opencv-python库
import cv2
import pytesseract
# 设置 pytesseract 使用的 Tesseract OCR 引擎路径
pytesseract.pytesseract.tesseract_cmd='C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('2.png')
# 将图像从 BGR 格式转换为 RGB 格式(pytesseract 要求输入为 RGB 格式)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
cv2.imshow('result',img)# 显示处理后的图像窗口,窗口名为 'result'
cv2.waitKey(0)# 等待用户按下任意键后关闭窗口(参数为0表示无限等待)
写下这段代码后运行即可读取2.png并显示为‘result’
接下来我们要给这些字母画上框框,首先需要得到这些字母的坐标
因此我们使用pytesseract.image_to_boxes(img)来获取字母的坐标
Z 728 8 832 110 0
从左到右依次为:字符;左下角的横坐标;左下角的纵坐标;右上角的横坐标;右上角的纵坐标;OCR 引擎对该字符识别的置信度。
获取到坐标后,我们将使用for b in boxes.splitlines():对每一个边界框信息进行遍历,使用b = b.split(' ')将每行的信息分割成单独的元素。
使用
x, y, w, h = int(b[1]), int(b[2]), int(b[3]), int(b[4])
提取边界框的坐标信息。x为左下角的横坐标;y为左下角的纵坐标;w为右上角的横坐标;h为右上角的纵坐标
接下来就可以使用cv2.rectangle来进行画矩形了
cv2.rectangle(img,(x,himg-h),(w,himg-y),(0,0,255),3)
cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift)
img: 这是要绘制矩形的图像对象,通常是一个 NumPy 数组。
pt1: 这是矩形的顶点之一,用元组
(x1, y1)
表示,其中(x1, y1)
是矩形左上角的坐标。pt2: 这是矩形的对角线顶点,用元组
(x2, y2)
表示,其中(x2, y2)
是矩形右下角的坐标。color: 这是矩形的颜色。它可以是一个表示颜色的元组,如
(B, G, R)
,其中B
、G
、R
分别是蓝色、绿色和红色的强度。例如,红色可以用(0, 0, 255)
表示。如果你在灰度图像上工作,可以直接传入一个灰度值。thickness: 这是矩形边框的粗细(以像素为单位)。如果设置为负值(例如
cv2.FILLED
),则函数会填充矩形内部。lineType: 这是可选参数,用于指定线条类型。默认情况下,它是
cv2.LINE_8
,表示8连通线条。你也可以使用cv2.LINE_AA
来获取抗锯齿线条。shift: 这是可选参数,指定坐标点的小数位数。通常情况下,不需要设置,使用默认值即可。
在这里我发现pytesseract库的原点坐标是在左下角,而opencv库的原点是在左上角,因此我画了一个示例图,以便大家理解
这时我们的代码是这样的
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd='C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('2.png')
# 将图像从 BGR 格式转换为 RGB 格式(pytesseract 要求输入为 RGB 格式)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
himg, wimg, _ = img.shape# 获取图像的高度和宽度
# 使用 pytesseract 进行图像文本检测,并返回每个检测框的坐标信息
boxes = pytesseract.image_to_boxes(img)
# 遍历每个检测框
for b in boxes.splitlines():
b = b.split(' ') #将每行的信息分割成单独的元素
print(b)
x,y,w,h = int(b[1]),int(b[2]),int(b[3]),int(b[4])
# 绘制矩形框(注意 OpenCV 的坐标系统以左上角为原点)
cv2.rectangle(img,(x,himg-h),(w,himg-y),(0,0,255),3)
cv2.imshow('result',img)
cv2.waitKey(0)
运行后得到这个图像,可以看出来我们的每一个字母都被完整的框出来了,接下来我们使用cv2.putText()将他的内容显示在字母旁边
cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
img:需要绘制文本的图像,必须是一个
numpy
数组。text:要绘制的文本内容,通常是一个字符串。
org:文本的起始坐标,即文本左下角的位置,以
(x, y)
形式表示,其中(0, 0)
是图像的左上角。fontFace:字体类型/字体族,例如
cv2.FONT_HERSHEY_SIMPLEX
、cv2.FONT_HERSHEY_PLAIN
等。这些字体类型可以通过cv2.putText()
函数来调用。fontScale:字体大小因子,指定字体大小相对于字体的基础大小的比例。
color:文本颜色,通常是一个元组
(B, G, R)
,每个颜色通道的取值范围是 0 到 255。thickness:文本线条的粗细,默认值为 1。如果设置为大于 1 的整数,则会增加文本的粗细。
lineType:文本线条的类型,默认值是
cv2.LINE_8
,表示 8 连通线条。可以选择cv2.LINE_AA
来获得抗锯齿线条。bottomLeftOrigin:可选参数,默认为
False
。如果设置为True
,则文本的起始点是左下角。通常为False
,表示文本的起始点是左上角。
在这里我们附上完整代码
import cv2
import pytesseract
# 设置 pytesseract 的路径(根据你的安装路径修改)
pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
# 读取图像
img = cv2.imread('2.png')
# 将图像从 BGR 格式转换为 RGB 格式(因为 pytesseract 使用 RGB 格式)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 获取图像的高度和宽度
himg, wimg, _ = img.shape
# 使用 pytesseract 库识别图像中的文本,并返回文本框的信息
boxes = pytesseract.image_to_boxes(img)
# 遍历每个文本框的信息
for b in boxes.splitlines():
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 - h), (w, himg - y), (0, 0, 255), 3)
# 在矩形框上方显示文本内容
cv2.putText(img, b[0], (x - 20, himg - y), cv2.FONT_HERSHEY_COMPLEX, 1, (100, 100, 255))
# 显示带有文本框和识别结果的图像
cv2.imshow('result', img)
# 等待按键输入来关闭窗口
cv2.waitKey(0)
# 关闭所有打开的窗口
cv2.destroyAllWindows()
最后再看一下我们的项目结果展示
项目结果
这样就OK了,感兴趣的可以点个关注,最近会一直更新,谢谢