解析:定时截取屏幕指定区域的图像,通过 OCR 识别数字,当识别到的数字≥30 时播放警报声
代码:
import pytesseract
from PIL import ImageGrab
import cv2,pygame,time
import numpy as np
pygame.mixer.init()
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def get_result(zuobiao = None):
# 截取屏幕特定区域
screenshot = ImageGrab.grab(zuobiao)
# screenshot.save("aa.png")
# 预处理图像
gray = cv2.cvtColor(np.array(screenshot), cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV)
# 保存处理后的图像
cv2.imwrite("save_path.png", thresh)
# 使用 Tesseract 识别
text = pytesseract.image_to_string(thresh, config='--oem 3 --psm 6 outputbase digits')
# print(f"识别结果: {text}")
return text
error_num = 0
num = 1
while True:
print(f"----------------------\n第{num}次检查中....")
num+=1
zb = (832, 243, 908, 952)
re = get_result(zb).strip("\n").replace("-","").split("\n")
# print(re)
if "." not in re[-1]:pass
else:
try:
a = float(re[-1])
print(a)
if a>=30:
print("到达预警值,开始播放警报声.........")
pygame.mixer.init()
pygame.mixer.music.load("警报1.mp3")
pygame.mixer.music.play(-1)
input()
pygame.mixer.music.stop()
break
else:
print("安全范围!!")
except Exception as e:
print(e)
error_num+=1
if error_num == 10:
break
time.sleep(3)
- 导入依赖库

pytesseract:调用 Tesseract OCR 引擎,实现图像文字识别(重点识别数字);PIL.ImageGrab/Image:PIL 库的截图、图像处理功能,ImageGrab.grab()用于截取屏幕;cv2:OpenCV 库,用于图像预处理(灰度化、二值化);pygame:主要用于播放音频(警报声);time:实现定时等待(每次检查间隔 3 秒);numpy:数组处理,OpenCV 处理图像依赖 NumPy 数组格式。
2. 初始化配置
pygame.mixer.init()
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
pygame.mixer.init():初始化 pygame 的音频播放模块,为后续播放警报声做准备;pytesseract.pytesseract.tesseract_cmd:指定 Tesseract OCR 的安装路径(必须配置,否则会找不到引擎)。
3. 核心函数:截图 + 预处理 + OCR 识别
def get_result(zuobiao = None):
# 截取屏幕特定区域
screenshot = ImageGrab.grab(zuobiao)
# screenshot.save("aa.png") # 注释掉的保存原始截图代码,用于调试
# 预处理图像(提升识别准确率)
gray = cv2.cvtColor(np.array(screenshot), cv2.COLOR_BGR2GRAY) # 彩色转灰度图
_, thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV) # 反相二值化
# 保存处理后的图像(用于调试,查看预处理效果)
cv2.imwrite("save_path.png", thresh)
# 使用Tesseract识别数字
text = pytesseract.image_to_string(thresh, config='--oem 3 --psm 6 outputbase digits')
return text
- 参数
zuobiao:屏幕截取区域的坐标,格式是(x1, y1, x2, y2),代表从左上角(x1,y1)到右下角(x2,y2)的矩形区域; - 图像预处理 :
np.array(screenshot):将 PIL 截图转为 OpenCV 支持的 NumPy 数组;- 灰度化 + 反相二值化:目的是把数字区域变成白色、背景变成黑色,大幅提升数字识别成功率;
- OCR 识别配置 :
--oem 3:使用默认的 OCR 引擎模式(混合引擎,兼容性最好);--psm 6:假设图像是单一均匀的文本块(适合数字识别);outputbase digits:只识别数字(过滤所有字母、符号,只保留 0-9 和小数点);
- 返回值:识别出的文本(主要是数字)。
- 主循环:监控逻辑
error_num = 0
num = 1
while True:
print(f"----------------------\n第{num}次检查中....")
num+=1
zb = (832, 243, 908, 952)
re = get_result(zb).strip("\n").replace("-","").split("\n")
# print(re)
if "." not in re[-1]:pass
else:
try:
a = float(re[-1])
print(a)
if a>=30:
print("到达预警值,开始播放警报声.........")
pygame.mixer.init()
pygame.mixer.music.load("警报1.mp3")
pygame.mixer.music.play(-1)
input()
pygame.mixer.music.stop()
break
else:
print("安全范围!!")
except Exception as e:
print(e)
error_num+=1
if error_num == 10:
break
time.sleep(3)
- 坐标
zb = (832, 243, 908, 952):这是你要监控的屏幕区域,需要根据实际数字位置调整; - 结果处理
re = ...:strip("\n"):去掉识别结果首尾的换行符;replace("-",""):去掉识别结果中的短横线(防止-30这类带符号的数字干扰,或误识别的横线);split("\n"):按换行符分割成列表(比如识别结果有多行时,取最后一行作为目标数字);
- 异常处理 :如果识别结果不是数字(比如识别出乱码、空字符串),会触发
float()转换异常,此时累计失败次数,达到 10 次就退出; input()阻塞:触发警报后,程序会停在这一行,直到你按下回车键,才会停止警报并退出。