OpenCV项目实战——使用Tesseract进行文本检测(非完全)

使用Tesseract进行文本检测

1. 下载、安装和配置Tesseract

我是直接根据该教程完成的配置,大家也可以看看进行参考:Tesseract安装和配置

  • win10进入环境变量步骤:
  • 1.右击此电脑,点击属性
  • 2.关于界面,相关设置里点击高级系统设置
  • 3.点击环境变量

注意:
1.我们需要下载Tesseract-ocr并且记住你的安装路径。
2.我们直接在命令提示符窗口,输入pip install pytesseract即可安装最新的pytesseract,当然也可以在pycharm中File-Settings-Project: -Python Interpreter中点击add,搜索pytesseract也可以进行安装。

2. 文本检测

使用到的API:

  • 1.pytesseract.get_tesseract_version():返回安装的Tesseract版本,使用print打印出来
  • 2.pytesseract.image_to_string(image, lang=None, config=’’, nice=0, output_type=Output.STRING, timeout=0):将图像上的OCR识别结果返回到字符串
    在这里插入图片描述
  • 3.pytesseract.image_to_boxes(image, lang=None, config=’’, nice=0, output_type=Output.STRING, timeout=0):返回包含已识别字符及其边界的结果(左下角横纵坐标和右上角横纵坐标
  • 4.pytesseract.image_to_data(image, lang=None, config=’’, nice=0, output_type=Output.STRING, timeout=0, pandas_config=None):返回包含框边界,置信度和其他信息的结果

2.1 字符检测

其中使用到的splitlines(),split()方法,可查看链接:splitline和split

# 导入
import pytesseract
import cv2

# 此处为你的tesseract.exe文件的安装路径
pytesseract.pytesseract.tesseract_cmd = 'D:\\Python\\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('./text_detect.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 1.打印出检测到的字符
print(pytesseract.image_to_string(img))
# 我们用矩形将检测到的字符框出来
# 展示左下角的坐标和右上角的坐标
hImg, wImg, _ = img.shape
boxes = pytesseract.image_to_boxes(img)
for b in boxes.splitlines():
	# 2.将每个字符的信息打印出来
    print(b)
    b = b.split(' ')
    print(b)
    # 字符信息列表中 1, 2, 3, 4位置上的为各个字符左下角的横纵坐标和右上角的横纵坐标
    x, y, w, h = int(b[1]), int(b[2]), int(b[3]), int(b[4])
    # 3.画出字符的外接矩形
    # 由于pytesseract.image_to_boxes()函数返回的坐标是以左下角为原点,而OpenCV是以左上角为原点,所以此处要进行坐标转换
    cv2.rectangle(img, (x, hImg-y), (w, hImg-h), (0, 0, 255), 2)
    # 我们将每个识别出的字符用文本写出来
    cv2.putText(img, b[0], (x, hImg-y+25), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果展示:
初始图像:
在这里插入图片描述
1.打印检测到的字符:
在这里插入图片描述
emm 我们发现他其中本应该分开的数字显示在一起了,目前我也不知道该怎么解决,有大佬知道的话,可以告诉我一下哈。
2.打印字符信息:
仅进行部分展示。
在这里插入图片描述
3.画出字符的外接矩形:
在这里插入图片描述

效果差强人意(勉强能看嗷,我明明是按照课程里一样做的,为啥就不一样。。。。)
正常效果应该是这样才对:
(所以到底是哪里出现了问题啊啊啊啊啊)
在这里插入图片描述

2.2 单词检测

附上enumerate()的用法:enumerate

import pytesseract
import cv2

pytesseract.pytesseract.tesseract_cmd = 'D:\\Python\\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('./text_detect.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 检测单词
hImg, wImg, _ = img.shape
# 1.打印得到的字符信息
boxes = pytesseract.image_to_data(img)
print(boxes)
for c, b in enumerate(boxes.splitlines()):
	# 根据下面的打印结果,我们可以发现有很多列,我们处理信息不需要第一行的信息名,所以我们用c计数,如果是第一行,我们不进行操作
    if c != 0:
        b = b.split()
        print(b)
        # 只有长度为12的才进行操作,因为我们可以看到打印的信息中,识别出来的单词都是在第12列的text下显示,如果没有我们也不进行下述操作
        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, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果展示:
1.打印得到的字符信息:
在这里插入图片描述
2.文本检测结果展示:
emmm 下面的数字还是出现了问题,我还是不会解决,嗯
在这里插入图片描述
成功的效果如图:
羡慕内,为啥他可以成功
在这里插入图片描述

2.4 只进行数字检测

其中:

cong = r’–oem 3 --psm 6 outputbase digits’ # 通过编写配置的搜索引擎来配置pytesseract要检测的是什么

在这里插入图片描述

import pytesseract
import cv2

pytesseract.pytesseract.tesseract_cmd = 'D:\\Python\\Tesseract-OCR\\tesseract.exe'
img = cv2.imread('./text_detect.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 进行数字检测
hImg, wImg, _ = img.shape
# 配置只检测数字
cong = r'--oem 3 --psm 6 outputbase digits'
boxes = pytesseract.image_to_data(img, config=cong)
print(boxes)
for c, b in enumerate(boxes.splitlines()):
    if c != 0:
        b = b.split()
        print(b)
        # 只有长度为12的才进行操作
        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, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imwrite('./text_ww_detect_characters2.png', img)
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

简要说明:
1.这里的代码块是将数字全部连接在一起展示
2.如果你要数字全部分开,可以使用字符检测中的代码,加上cong,并在pytesseract.image_to_boxes()函数中加上 config=cong 即可

结果展示:
我的展示不了嗷,因为我的图片出来还是全部都识别了,但视频课程里是值检测了数字,待我以后解决了再来补上嗷(如果我真的能解决的话)

直接上成功的效果:
在这里插入图片描述
其中的代码,我与视频课程中是完全一致的,但效果却不尽如人意,这让我这种初学者很犯难,但也没有办法有时间去问问老师吧。。。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值