如何使用Python 3.x检测图像中字符位置?pytesseract调用报错求助
嘿,我来帮你解决这个字符位置检测的问题!你遇到的错误大概率是因为旧版的run_tesseract方法在新版pytesseract里已经被弃用了,而且原代码的配置和读取逻辑也有不少坑。我给你整理了一套更靠谱、兼容新版库的实现方案:
获取图像字符位置的修正方案
1. 核心思路:用新版API替代弃用方法
新版pytesseract提供了image_to_data和image_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=True和config="hocr"会导致输出格式混乱,hocr是HTML格式,和box文件的纯文本格式不兼容。 - 读取逻辑错误:box文件的列是用制表符分隔的,原代码用空格作为分隔符会导致行拆分错误,读取到的内容不符合预期。
内容的提问来源于stack exchange,提问作者Srihari




