编程语言
首页 > 编程语言> > OpenCV-Python-Tesseract_OCR 实现对图像中字符的识别、提取、标识(可实时,附源码)

OpenCV-Python-Tesseract_OCR 实现对图像中字符的识别、提取、标识(可实时,附源码)

作者:互联网

OpenCV杂谈_05


一. 需要做的前期准备
  1. 环境配置:
    Python版本:3.9.0
    功能包:opencv-python(4.5.2.52)
    提前安装Tesseract_OCR工具,下载地址:http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe(切记:记录好Tesseract_OCR文件夹所安装的位置,作者这里为:C:\Program Files (x86)\Tesseract-OCR)
  2. 需要自行搜索想要识别的图像,作为input;或者实时检测的情况下调用摄像头也可
  3. 一个用的顺手的IDE(本人推荐Pycharm)00

二. 源码如下

import cv2
import pytesseract

# 将tesseract导入到OpenCV中(注意格式)
pytesseract.pytesseract.tesseract_cmd = "C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe"

# 读取图像
img = cv2.imread('english.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # tesseract支持的是RGB格式图像,而OpenCV是BGR,因此需要将想要读取的图像转换为RGB格式

# print(pytesseract.image_to_string(img))  # 用于读取图片中的所有英文字母
# print(pytesseract.image_to_boxes(img))  # 用于输出假设字母上边有boundingbox,则Boundingbox的左上角坐标以及右下角坐标分别是什么

# 检测字符
hImg, wImg, _ = img.shape
boxes = pytesseract.image_to_boxes(img)
for box in boxes.splitlines():
    # print(box)  # 打印出图片中所有的英文字母以及它所对应的boundingbox的左上角点和右下角点
    box = box.split(' ')
    print(box)  # 为了方便调用每一个相关的值,将每个字母及其boundingbox的左上角右下角坐标保存在一个列表中
    x1, y1, x2, y2 = int(box[1]), int(box[2]), int(box[3]), int(box[4])
    cv2.rectangle(img, (x1, hImg - y1), (x2, hImg - y2), (0, 0, 255), 2)  # 给每一个字母画上所对应的框
    cv2.putText(img, box[0], (x1, hImg - y1 - 90), cv2.FONT_ITALIC, 1, (50, 50, 255), 2)  # 给每一个框上标记上检测出来的结果,根据想要写字符的位置进行对 (x1, hImg - y1 - 数字)中数字的修改


# 调用摄像头的实时字符检测 (想要使用本功能则将上边检测字符的代码块注释掉,将本段代码块恢复运行即可)
# cap = cv2.VideoCapture(0)
# cap.set(3, 640)
# cap.set(4, 480)
#
#
# def captureScreen(bbox=(300, 300, 1500, 1000)):
#     capScr = np.array(ImageGrab.grab(bbox))
#     capScr = cv2.cvtColor(capScr, cv2.COLOR_RGB2BGR)
#     return capScr
#
#
# while True:
#     timer = cv2.getTickCount()
#     _, img = cap.read()
#     # 检测画面中的字符
#     hImg, wImg, _ = img.shape
#     boxes = pytesseract.image_to_boxes(img)
#     for b in boxes.splitlines():
#         b = b.split(' ')
#         x, y, w, h = int(b[1]), int(b[2]), int(b[3]), int(b[4])
#         cv2.rectangle(img, (x, hImg - y), (w, hImg - h), (50, 50, 255), 2)
#         cv2.putText(img, b[0], (x, hImg - y + 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (50, 50, 255), 2)
#     fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer)
#     cv2.putText(img, 'FPS:' + str(int(fps)), (75, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (20, 230, 20), 2)
#     cv2.imshow("Result", img)
#     cv2.waitKey(1)
#

# 展示图像 (使用实时检测功能时要将该部分代码块注释掉)
cv2.imshow("Result", img)
cv2.waitKey(0)

三. 结果展示

  1. 非实时
    by demo
  2. 实时
    by demo

四. 感悟与分享

  1. 明显可以看出实时的检测结果很不稳定,且容易出错。
  2. 只对画面中字符的识别是远远不够的,需要做字符的联结(换句话说就是去主动地将字符做合理拼接成为单词),其实是有解决办法的,即使用pytesseract.image_to_data,但作者这里一直报错Attribute Error:‘list’ object has no attribute 'read',且尚未解决,解决之后会第一时间进行更新。
  3. 参考课程及推荐:https://www.youtube.com/watch?v=6DjFscX4I_c(内容为英文,且需要翻墙)

如有问题,敬请指正。欢迎转载,但请注明出处。

标签:box,img,Python,cv2,int,源码,pytesseract,hImg,OCR
来源: https://blog.csdn.net/weixin_40247876/article/details/116993313