You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python 3.x检测图像中字符位置?pytesseract调用报错求助

嘿,我来帮你解决这个字符位置检测的问题!你遇到的错误大概率是因为旧版的run_tesseract方法在新版pytesseract里已经被弃用了,而且原代码的配置和读取逻辑也有不少坑。我给你整理了一套更靠谱、兼容新版库的实现方案:

获取图像字符位置的修正方案

1. 核心思路:用新版API替代弃用方法

新版pytesseract提供了image_to_dataimage_to_boxes这两个更易用的API,能直接返回字符级别的位置数据,不用再生成box文件后手动读取,既简洁又避免了文件操作的坑。

2. 完整可运行代码示例

import cv2
import pytesseract
from pytesseract import Output
import csv

# 加载目标图像
img = cv2.imread('bw.png')
if img is None:
    raise ValueError("无法加载图像,请检查文件路径是否正确!")

# 获取字符级别的结构化数据
# --psm 6 表示假设图像是单一均匀文本块,可根据场景调整
char_data = pytesseract.image_to_data(
    img,
    output_type=Output.DICT,
    lang=None,
    config='--psm 6'
)

# 提取有效字符的位置信息
char_boxes = []
total_chars = len(char_data['text'])
for idx in range(total_chars):
    # 过滤掉置信度为0的无效识别结果和空字符
    if int(char_data['conf'][idx]) > 0 and char_data['text'][idx].strip() != '':
        char = char_data['text'][idx]
        x_left = char_data['left'][idx]
        y_top = char_data['top'][idx]
        width = char_data['width'][idx]
        height = char_data['height'][idx]
        # 整理为[字符, 左上角X, 左上角Y, 右下角X, 右下角Y]格式
        char_boxes.append([char, x_left, y_top, x_left + width, y_top + height])

# 在图像上绘制字符边界框
for box in char_boxes:
    char, x1, y1, x2, y2 = box
    # 绘制绿色矩形框(线宽2)
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
    # 在框上方标注对应字符(红色字体)
    cv2.putText(
        img,
        char,
        (x1, y1 - 10),
        cv2.FONT_HERSHEY_SIMPLEX,
        0.5,
        (0, 0, 255),
        2
    )

# 显示带框的结果图像
cv2.imshow('Character Position Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# (可选)将结果保存到CSV文件
with open('character_positions.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['Character', 'X1', 'Y1', 'X2', 'Y2'])
    writer.writerows(char_boxes)

3. 关键细节说明

  • PSM模式调整--psm 6是最常用的文本块模式,如果你的图像是单个字符、多行不规则文本,可以换成对应的PSM参数(比如--psm 8用于单个字符识别)。
  • 置信度筛选:通过conf字段过滤低置信度结果,能有效避免空字符、错误识别的内容混入结果。
  • 数据格式友好:用Output.DICT返回字典格式数据,方便直接提取需要的字段,比旧版的box文件读取更可靠。

4. 原代码的问题复盘

  • 方法弃用pt.run_tesseract在新版pytesseract中已被移除,调用会直接抛出AttributeError
  • 配置冲突:同时设置boxes=Trueconfig="hocr"会导致输出格式混乱,hocr是HTML格式,和box文件的纯文本格式不兼容。
  • 读取逻辑错误:box文件的列是用制表符分隔的,原代码用空格作为分隔符会导致行拆分错误,读取到的内容不符合预期。

内容的提问来源于stack exchange,提问作者Srihari

火山引擎 最新活动