我是直接根据该教程完成的配置,大家也可以看看进行参考:Tesseract安装和配置
注意:
1.我们需要下载Tesseract-ocr并且记住你的安装路径。
2.我们直接在命令提示符窗口,输入pip install pytesseract即可安装最新的pytesseract,当然也可以在pycharm中File-Settings-Project: -Python Interpreter中点击add,搜索pytesseract也可以进行安装。
使用到的API:
其中使用到的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.画出字符的外接矩形:
效果差强人意(勉强能看嗷,我明明是按照课程里一样做的,为啥就不一样。。。。)
正常效果应该是这样才对:
(所以到底是哪里出现了问题啊啊啊啊啊)
附上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 下面的数字还是出现了问题,我还是不会解决,嗯
成功的效果如图:
羡慕内,为啥他可以成功
其中:
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 即可
结果展示:
我的展示不了嗷,因为我的图片出来还是全部都识别了,但视频课程里是值检测了数字,待我以后解决了再来补上嗷(如果我真的能解决的话)
直接上成功的效果:
其中的代码,我与视频课程中是完全一致的,但效果却不尽如人意,这让我这种初学者很犯难,但也没有办法有时间去问问老师吧。。。