使用RaspberryPi+摄像头识别电表数字,pytesseract无法正常识别
电表OCR识别故障修复方案
问题背景
使用Raspberry Pi搭配摄像头拍摄电表图片进行OCR识别时,遇到两类问题:
- 执行阈值处理后,Tesseract无法识别任何内容
- 跳过阈值处理时,识别出的数字错误率高且不完整
相关图片:
- 原始图片:

- CV处理后图片:

- 未做阈值处理的图片:

当前使用代码:
import pytesseract import cv2 img = cv2.imread('meter2.jpg',cv2.IMREAD_GRAYSCALE) img = cv2.bitwise_not(img) img = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) cv2.imwrite('meter-processed.jpg',img) custom_config = r'--oem 3 --psm 11 -c tessedit_char_whitelist=0123456789' num = pytesseract.image_to_string(img,config=custom_config) print(num)
针对性优化方案
1. 修复预处理流程,避免数字边缘丢失
从处理后的图片可见,自适应阈值参数(窗口大小11、权重2)导致部分数字的笔画被过度模糊,完全丢失识别特征。建议替换为高斯模糊+OTSU自动阈值组合:
import pytesseract import cv2 # 读取灰度图 img = cv2.imread('meter2.jpg', cv2.IMREAD_GRAYSCALE) # 高斯模糊降噪,消除摄像头噪点 img = cv2.GaussianBlur(img, (5, 5), 0) # OTSU自动计算最优阈值,同时反转黑白(匹配电表数字的亮字暗底) _, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) cv2.imwrite('meter-processed.jpg', img)
2. 调整Tesseract识别参数,适配电表场景
当前--psm 11是针对稀疏文本的通用模式,不适合电表这种固定格式的数字块。推荐使用以下PSM模式:
--psm 6:假设图像是单一均匀文本块(适合整组电表数字)--psm 7:将图像视为单行文本(如果数字是横向排列)
修改后的配置:
custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789' num = pytesseract.image_to_string(img, config=custom_config) print(num)
3. 裁剪数字区域,排除背景干扰(核心优化)
原始图片中电表数字仅占小部分区域,大量背景元素会误导识别。手动裁剪数字区域后再处理,能大幅提升准确率:
# 示例:根据你的图片测量数字区域的坐标(x1, y1)(左上角)、(x2, y2)(右下角) # 需自行调整坐标值,可通过画图工具查看像素位置 x1, y1 = 200, 300 x2, y2 = 600, 400 cropped_img = img[y1:y2, x1:x2] # 后续预处理和OCR均使用裁剪后的图像 cropped_img = cv2.GaussianBlur(cropped_img, (5,5), 0) _, cropped_img = cv2.threshold(cropped_img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) cv2.imwrite('meter-cropped.jpg', cropped_img) num = pytesseract.image_to_string(cropped_img, config=custom_config) print(num)
4. 树莓派环境校验
确保依赖库是最新版本:
# 更新系统并安装最新Tesseract sudo apt update && sudo apt install tesseract-ocr tesseract-ocr-eng -y # 升级Python依赖 pip install --upgrade pytesseract opencv-python
验证步骤
- 先裁剪出精准的数字区域
- 执行高斯模糊+OTSU阈值预处理
- 使用
--psm 6配置运行OCR - 逐步调整参数(比如模糊窗口大小、PSM模式)直到得到稳定结果
内容的提问来源于stack exchange,提问作者Yoav Mor
相关产品推荐
相关产品推荐

