Python OCR算术序列计算项目遇int转换报错ValueError: invalid literal for int()
问题根源
- OCR识别将半角负号
-识别为了全角长破折号—,Python内置的int()转换函数仅支持半角减号作为负数标识,因此直接转换会报错。 - 现有正则匹配规则、公差计算逻辑、语法均存在错误,即使解决符号问题也无法得到正确结果。
修复方案
按以下步骤修改代码即可:
- 新增文本预处理步骤,将识别结果中的全角长破折号统一替换为半角减号
- 修正正则匹配规则,适配所有整数场景
- 修正公差计算逻辑,符合等差数列定义
- 修正乘法语法错误,Python中乘法需显式写
*运算符
如果不需要额外依赖numpy,仅修改核心逻辑的代码如下:
import cv2 import pyautogui as auto import time import pytesseract import re time.sleep(1) # take screenshot using pyautogui image = auto.screenshot("image2.png", region=(420,450, 600, 100)) pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" img = cv2.imread("image2.png") text = pytesseract.image_to_string(img) # 关键修复:将全角长破折号替换为可识别的半角减号 text = text.replace("—", "-") print(text[0:67]) # 修正正则:匹配所有正负整数 pattern = r"-?\d+" num_list = re.findall(pattern, text) # 统一转换为整数 num_list = list(map(int, num_list)) An = num_list[0] A1 = num_list[1] A2 = num_list[2] # 等差数列公差直接为后项减前项,无需判断大小 d = A2 - A1 # 修正乘法语法错误 Answer = A1 + (An - 1) * d print(Answer) cv2.imshow("Img", img) cv2.waitKey(0)
额外优化建议
- 可添加长度校验:判断
num_list的长度是否至少为3,避免OCR识别异常时索引报错 - 可添加二值化、降噪等图像预处理步骤,提升OCR识别准确率
- 避免重复调用
re.findall,复用第一次返回的匹配结果即可减少不必要的计算
内容的提问来源于stack exchange,提问作者N1cmo
相关产品推荐
相关产品推荐

